Erlang でランダムな英数字 ID を生成しようとしています。私は素朴crypto:strong_rand_bytes(Bytes)
にランダムなバイナリを生成しようとしましたが、そのバイナリを使用して作成されたように使用しました<<"my_unique_random_id">>
.
ええと、erlang のドキュメントや他の場所で他のオプションを探しましたが、何も見つかりませんでした。誰かが私に解決策を教えてもらえますか?
それはあなたが必要とするランダム性に依存するかもしれません。Erlangのcrypto
モジュールは、モジュールよりも強力なランダムデータを生成しrandom
ます([erlang-questions]Yawsセキュリティアラート-Yaws1.93およびこの質問も参照してください)。IDの生成に使用strong_rand_bytes
する場合は、そのbase64を取得するだけで十分な場合があります。
> base64:encode(crypto:strong_rand_bytes(Bytes)).
必要に応じて、これをリストに変えることができます。
Erlang でランダムな文字列を生成するによれば、特定の文字セットから指定された長さの文字列を生成するのに、Erlang の数行しかかかりません。
get_random_string(Length, AllowedChars) ->
lists:foldl(fun(_, Acc) ->
[lists:nth(random:uniform(length(AllowedChars)),
AllowedChars)]
++ Acc
end, [], lists:seq(1, Length)).
ブログ投稿には、コードの行ごとの説明があります。いくつかの最適化のヒントについては、コメントを参照してください。
randchar(N) ->
randchar(N, []).
randchar(0, Acc) ->
Acc;
randchar(N, Acc) ->
randchar(N - 1, [random:uniform(26) + 96 | Acc]).