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()会导致时钟偏移。你是对的,这就是为什么只有在平均调用频率有限的情况下才能使用它。