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)
如果需要,您可以将其转换为列表.
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)
博客文章对代码进行了逐行说明.查看一些优化提示的注释.
小智 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)