Elixirでランダムな文字列を作る
Elixirでランダムな文字列を作りたかったのでメモ。
方法1
defmodule RandomString do
def randstr do
"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|> String.codepoints
|> Enum.take_random(30)
|> Enum.join
end
end
# iex(1)> RandomString.randstr
# "LUoSFEV4xhDnQ8ARBd9z5vuNrMfKeG"
使用する文字を詰め込んだ文字列からランダムに30文字を選択して文字列を生成する方法。
しかし、これでは同じ文字の重複がないペラペラな文字列になってしまうことに気づいたので修正。
defmodule RandomString do
def randstr, do: _randstr([])
defp _randstr(list) when length(list)>=30, do: Enum.join(list)
defp _randstr(list) when length(list)<30 do
char = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|> String.codepoints
|> Enum.take_random(1)
|> List.first
_randstr([char|list])
end
end
# iex(1)> RandomString.randstr
# "cM7EpLFWRvZTMeAufWneyU1NaGwsaf"
長い!わかりにくい!
方法2
stackoverflowではこんなやり方が書いていました。
Phoenix framework Generate random string using the controller
iex(1)> length = 32
32
iex(3)> :crypto.strong_rand_bytes(length) |> Base.encode64 |> binary_part(0, length)
"YiX2oINVqVWCCQZdmESBN44OxcErAFR4"
うーんこちらの方がスマートですね。