2009-11-01 131 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節點。