我需要生成一个随机文件密钥。它必须验证以下正则表达式:
~r/[A-Z0-9]{8}/
在Elixir中生成这样一个随机字符串的最佳方法是什么?
答案 0 :(得分:2)
我创建一个包含所有可能字符的二进制文件,然后使用:rand.uniform/1
生成的随机整数随机选择其中一个:
defmodule A do
@bytes "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
def random(length) do
for(_ <- 1..length, do: :binary.at(@bytes, :rand.uniform(byte_size(@bytes) - 1))) |> List.to_string
end
end
for _ <- 1..10 do
IO.puts A.random(8)
end
输出:
J0C924EG
N9VOSW2Y
GRGYHTQH
I7HMWUCY
T3GRBSB7
VT5XU405
I7ZQNENP
1KDR9YLG
JB3BCYWC
8NZUPXZ1
请注意,此随机输出的加密性不强。 Erlang文档建议使用:crypto.strong_rand_bytes/1
,但将其输出截断为[A-Z0-9]
的代码比我上面写的简单代码要多一些。
答案 1 :(得分:1)
快速而肮脏(可能不是世界上最好的解决方案),但这样的事情会起作用。
defmodule RandomKey do
@charset Enum.to_list((65..90)) ++ Enum.to_list((1..9))
def generate(size \\ 8) when is_integer(size) do
char_list = for _ <- 1..size, do: do_generate()
Enum.join(char_list)
end
defp do_generate do
char = Enum.random(@charset)
if char > 9 do
List.to_string [char]
else
to_string(char)
end
end
end
调用RandomKey.generate/1
将为您提供长度为8的默认密钥,但您可以选择指定其他大小。