如何使用Erlang生成随机字母数字字符串?

Max*_*erz 14 string erlang utf-8

我正在尝试使用Erlang生成随机字母数字ID.我天真地尝试crypto:strong_rand_bytes(Bytes)生成一个随机二进制文件,然后使用它创建的二进制文件<<"my_unique_random_id">>- 这不起作用,因为随机位不一定是有效的UTF-8字符串,对吧?

好吧,我在erlang文档和其他地方寻找其他选项,但我没有找到任何东西.有人能指出我的解决方案吗?

Til*_*man 13

这可能取决于您需要的随机性.Erlang的crypto模块产生比模块更强的随机数据random(参见[erlang-questions] Yaws安全警报 - 雅司病毒1.93这个问题).如果你想用来strong_rand_bytes生成一个ID,那么获取它的base64就足够了:

> base64:encode(crypto:strong_rand_bytes(Bytes)).
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以将其转换为列表.

  • 救援的正则表达式:`re:replace(base64:encode(crypto:strong_rand_bytes(Bytes)),"\\ W","",[global,{return,binary}]). (3认同)
  • 这适用于生成随机位串,但不会创建字母数字字符串。该字符串可能包含特殊字符,例如“+”和“=”。 (2认同)

Bil*_*ard 12

根据在Erlang中生成随机字符串,只需要几行Erlang就可以从某组字符生成指定长度的字符串.

get_random_string(Length, AllowedChars) ->
    lists:foldl(fun(_, Acc) ->
                        [lists:nth(random:uniform(length(AllowedChars)),
                                   AllowedChars)]
                            ++ Acc
                end, [], lists:seq(1, Length)).
Run Code Online (Sandbox Code Playgroud)

博客文章对代码进行了逐行说明.查看一些优化提示的注释.

  • 要在每次重新启动Erlang VM时获得不同的结果,您应该为随机化器播种(例如:`random:seed(erlang:now())`).欲了解更多信息,请查看[here](http://stackoverflow.com/a/4975193/727663)或[here](http://pdincau.wordpress.com/2012/02/15/how-to-产生随机号码合的erlang /) (2认同)

小智 6

我已经准备了小模块来做这件事
它也使用crypto:rand_uniform/2但没有过时random:uniform

module(cloud_rnd).

-export([rnd_chars/1, rnd_numbers/1, rnd_chars_numbers/1]).

rnd_chars(L)         -> get_rnd(L, chars).
rnd_numbers(L)       -> get_rnd(L, numbers).
rnd_chars_numbers(L) -> get_rnd(L, chars_numbers).

get_rnd(L, chars)         -> gen_rnd(L, "abcdefghijklmnopqrstuvwxyz");
get_rnd(L, numbers)       -> gen_rnd(L, "1234567890");
get_rnd(L, chars_numbers) -> gen_rnd(L, "abcdefghijklmnopqrstuvwxyz1234567890").

gen_rnd(Length, AllowedChars) ->
  MaxLength = length(AllowedChars),
  lists:foldl(
    fun(_, Acc) -> [lists:nth(crypto:rand_uniform(1, MaxLength), AllowedChars)] ++ Acc end,
    [], lists:seq(1, Length)
  ).
Run Code Online (Sandbox Code Playgroud)