[UUID唯一資源命名空間的來龍去脈(RFC4122)]
簡介
UUID, 又名全球獨立標識(Globally Unique Identifier), 當然原名更高大上點兒, A.K.A 宇宙獨立標識(Universally Unique Identifier). UUID最初用在一個本屌沒聽過的網(wǎng)絡(luò)系統(tǒng)中, 然后被廣泛應用到微軟抄做系統(tǒng).
UUID是128位(長度固定)unsigned integer, 能夠保證(真的假的劫拢?)在空間(Space)與時間(Time)上的唯一性俊抵。而且無需注冊機制保證, 可以按需隨時生成芥驳。
據(jù)WIKI, 隨機算法生成的UUID的重復概率為170億分之一
由于UUID定長且與時間有關(guān), 有一定可能性UUID會重復出現(xiàn)(大概在西元(A.D)3400, 與具體實現(xiàn)算法有關(guān))
UUID生成算法最高支持10,000,000(一千萬)每秒每臺機器, 所以可以用作交易流水ID
uuid(Python)和NSUUID(iOS)遵循本RFC
UUID生成三種方式
- 基于利用MAC地址(若由于某種原因包括隱私考慮, MAC地址不可用或強烈不推薦, 采用以下兩種替代方法)
- 基于偽隨機數(shù)
- 基于加密哈希(MD5之類的東東)和應用自定義字符串
字符表示
[time-low]-[time-mide]-[time-high-and-version]-[clock-seq-and-reserved 和 clock-seq-low]-[node]
time-low = 32位 unsigned integer
time-mid = 16位 unsigned integer
time-high-and-version = 16位 unsigned integer(時間戳高位部分與版本(Version)號混合)
clock-seq-and-reserved = 8位 unsigned integer(時鐘序列高位部分與預定義變量(Variant)混合組成)
clock-seq-low = 8位 unsigned integer
node = 48位 unsigned integer
urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6
字段組成(詳情與事例代碼,參考RFC4122 section4 till the end)
UUID采用Big-endian字節(jié)序排列
變量(variant), 或稱做類型, 4 bytes, 包括以下4種(其中X為任意值):
0XX NCS兼容預留
10X RFC4122采用
110 微軟兼容預留
111 還未定義, 留作以后它用
版本號(version), 4 bytes, 一共以下5個版本:
0001 時間的版本
0010 DCE Security
0011 MD5哈希
0100 (偽)隨機數(shù)
0101 SHA-1哈希
時間戳(timestamp), 60bit:
版本1: 時間戳采用UTC時間,以100ns為間隔,重1582年10月15日00:00:00.00開始計算
時鐘序列, 14bit:
版本1: 用來防止在時間回調(diào)的情況下,導致的UUID重復問題
如果有時間回調(diào)(可能有系統(tǒng)斷電導致),如果生成器在回調(diào)時間之后有生成新的UUID,那么時鐘序列應該改變, 如果新生成的UUID時鐘序列可知,那么時鐘序列遞增即可; 若不可知, 那么時鐘序列應重置到一個47位隨機數(shù),或一個47位高質(zhì)量的偽隨機數(shù),并且第48位設(shè)置為1,用來區(qū)別真正的MAC地址(由于所有MAC地址在網(wǎng)卡中第48為0)
節(jié)點(node), 48bit:
版本1: 為主機MAC地址, 若主機有多個MAC地址,隨機選其中一個, 若系統(tǒng)沒有MAC地址, 則采用(偽)隨機數(shù).
其他版本請參考原文, 其中版本2沒有在原文中敘述
Nil UUID
128位中,每一位都是零, (A.K.A)
urn:uuid:00000000-0000-0000-0000-000000000000