生成随机文件密钥

时间:2017-03-15 14:25:49

标签: elixir

我需要生成一个随机文件密钥。它必须验证以下正则表达式:

~r/[A-Z0-9]{8}/

在Elixir中生成这样一个随机字符串的最佳方法是什么?

2 个答案:

答案 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的默认密钥,但您可以选择指定其他大小。