2009-11-01 129 views

回答

5

http://github.com/travis/erlang-uuid

-module(uuid). 
-export([v4/0, to_string/1, get_parts/1]). 
-import(random). 

v4() -> 
    v4(random:uniform(math:pow(2, 48)) - 1, random:uniform(math:pow(2, 12)) - 1, random:uniform(math:pow(2, 32)) - 1, random:uniform(math:pow(2, 30)) - 1). 
v4(R1, R2, R3, R4) -> 
    <<R1:48, 4:4, R2:12, 2:2, R3:32, R4: 30>>. 
to_string(U) -> 
    lists:flatten(io_lib:format("~8.16.0b-~4.16.0b-~4.16.0b-~2.16.0b~2.16.0b-~12.16.0b", get_parts(U))). 

get_parts(<<TL:32, TM:16, THV:16, CSR:8, CSL:8, N:48>>) -> 
    [TL, TM, THV, CSR, CSL, N]. 
+0

我无法执行v4(): 2> uuid:v4()。 **异常错误:没有函数子句匹配random:统一(281474976710656.0) in函数uuid:v4/0 – 2009-11-01 14:16:55

+3

为您提交了一个错误;-) http://github.com/travis/erlang-uuid/issues/ #issue/1 – 2009-11-01 14:56:56

+3

总而言之,重新计算数学并没有太多意义:pow(2,48)总是可以用16#FFFFFFFFFFFF替换。其他类似。 – Zed 2009-11-01 17:40:52

2

你为什么要使用round(math:pow(2, 48))?我认为1 bsl 48将更快地工作,并且代码不会失去理解。从CouchDB的

6

对于像我这样的未来谷歌,erlang-uuid from avtobiff工作非常简单。

+1

我同意你的观点,erlang-uuid的作品很好。 – Elzor 2014-04-06 10:06:54

0

如果你不需要遵循RFC 4122可以使用now/0调用不产生外部依赖的唯一ID,因为元组,由现在称之为产生的是虚拟机里面绝对是独一无二的,独特的大概率beetween节点。