Filesystems 目录的唯一字符串
我想创建用于控制目录的磁盘配额的唯一目录。将按如下方式创建唯一目录名:Filesystems 目录的唯一字符串,filesystems,erlang,Filesystems,Erlang,我想创建用于控制目录的磁盘配额的唯一目录。将按如下方式创建唯一目录名: unique_string()-> base64:encode_to_string(term_to_binary(make_ref())). 但在调试时,出现了以下问题: exception exit: {{badmatch, {error, " g3IAA2QAFGVtYWNzQHl1cy1pTWF
unique_string()->
base64:encode_to_string(term_to_binary(make_ref())).
但在调试时,出现了以下问题:
exception exit: {{badmatch,
{error,
" g3IAA2QAFGVtYWNzQHl1cy1pTWFjLmxvY2FsAwAB/ncAAAA8AAAAAA==: No such file or directory.\r\n"}},
唯一的_字符串包含“/”,这导致了问题
如果只是删除“/”,恐怕unique的功能会丢失。如何解决这个问题?
此外,目录中是否有其他字符不能使用?您可以用
hexify
函数替换base64:encode\u to\u string
,如下所示
hexify(Binary) ->
lists:flatten([io_lib:format("~2.16.0b", [B]) || <<B>> <= Binary]).
您可以将
base64:encode_to_string
替换为hexify
函数,如下所示
hexify(Binary) ->
lists:flatten([io_lib:format("~2.16.0b", [B]) || <<B>> <= Binary]).
如果您只需要一个唯一的值,并且不需要超过每毫秒1次,那么为什么不使用当前系统时间到毫秒?它比您上面提到的功能快得多,并且非常独特
如果有可能在一毫秒内获得多个值,您可以将最后一个唯一值存储在静态变量中,并确保新值大于该值,否则使用最后一个值加上一个值。如果您只需要一个唯一值,并且每毫秒不需要超过1,为什么不直接使用当前系统时间到毫秒?它比您上面提到的功能快得多,并且非常独特
如果有可能在毫秒内获得多个值,您可以将最后一个唯一值存储在静态变量中,并确保新值大于该值,否则使用最后一个值加上一个值。一个erlang VM保证为每个时间请求提供不同的值。即使在通常以1毫秒的精度给出时间的Windows机器上,多次访问也会以1µs的速度给出结果:
2> R = {now(),now(),now(),now()}.
{{1357,408695,109000},
{1357,408695,109001},
{1357,408695,109002},
{1357,408695,109003}}
因此,如果您认为调用频率实际上低于每秒1000000次调用(避免对erlang时间造成重大干扰非常重要),则该方法可以有效地工作。一个erlang VM保证为每个时间请求提供不同的值。即使在通常以1毫秒的精度给出时间的Windows机器上,多次访问也会以1µs的速度给出结果:
2> R = {now(),now(),now(),now()}.
{{1357,408695,109000},
{1357,408695,109001},
{1357,408695,109002},
{1357,408695,109003}}
因此,如果您认为调用频率实际上低于每秒1000000次调用(避免对erlang时间造成重大干扰很重要),则该方法可以有效地工作。使用ref()作为字符串,如果重新启动VM,则可以获得相同的目录名。这重要吗?
正如其他用户所说,如果调用频率低于每微秒1次调用,则可以使用now()
两个建议
random_md5_name() ->
Str = lists:flatten(io_lib:format("~p", [now()])),
lists:flatten([io_lib:format("~2.16.0b", [B]) || <<B>> <= erlang:md5(Str)].
random_numeric_name() ->
lists:flatten(io_lib:format("~p~p~p", tuple_to_list(now()))).
random\u md5\u name()->
Str=list:flatten(io_lib:format(“~p”,[now()]),
列表:展平([io_lib:format(“~2.16.0b)”,[B])||
列表:扁平化(io_lib:format(“~p~p~p”,tuple_to_list(now()))。
使用ref()作为字符串,如果重新启动VM,可能会得到相同的目录名。这有关系吗?
正如其他用户所说,如果调用频率低于每微秒1次调用,则可以使用now()
两个建议
random_md5_name() ->
Str = lists:flatten(io_lib:format("~p", [now()])),
lists:flatten([io_lib:format("~2.16.0b", [B]) || <<B>> <= erlang:md5(Str)].
random_numeric_name() ->
lists:flatten(io_lib:format("~p~p~p", tuple_to_list(now()))).
random\u md5\u name()->
Str=list:flatten(io_lib:format(“~p”,[now()]),
列表:展平([io_lib:format(“~2.16.0b)”,[B])||
列表:扁平化(io_lib:format(“~p~p~p”,tuple_to_list(now()))。
Riak使用ref中的sha哈希和时间戳生成唯一密钥
crypto:sha(term_to_binary({make_ref(), os:timestamp()}))
Riak使用ref中的sha哈希和时间戳生成唯一密钥
crypto:sha(term_to_binary({make_ref(), os:timestamp()}))
文件名中允许的字符因操作系统而异。您确定不需要a吗?非常感谢您的回复。UUID可以满足我的要求。文件名中允许的字符因操作系统而异。您确定不需要a吗?非常感谢您的回复。UUID可以满足我的要求。因为许多进程都在运行同时,可能会发生冲突。一个erlang VM保证为每个时间请求提供不同的值。即使在通常以1毫秒精度提供时间的Windows计算机上,多次访问也会以1µs的速度提供结果:因为许多进程同时运行,所以可能会发生冲突。一个erlang VM保证提供不同的值即使在通常以1毫秒精度给出时间的Windows计算机上,多次访问也会以1微秒的速度给出结果:使用这种方法存在危险:使用erlang:now()反复快速地使用erlang:now()会导致时钟偏移。你是对的,这就是为什么只有在平均调用频率有限的情况下才能使用它。使用这种方法存在危险:反复快速地使用erlang:now()会导致时钟偏移。你是对的,这就是为什么只有在平均调用频率有限的情况下才能使用它。