日期:2014-04-26(該死, 又凌晨了)
原文參考:http://tools.ietf.org/html/rfc4122.htmlhtml
前言:高級與普通程序員的區別就是, 普通程序只復(cao)用(xie)代碼片斷, 而高級一點的無非就只知道點規範, 寫點東西, 讓其餘人Copynode
本屌最討厭的面試題是, XXX爲何這麼設計, TMD我哪知道啊, 創始人就這麼寫, 我也沒轍啊!程序員
UUID, 又名全球獨立標識(Globally Unique Identifier), 固然原名更高大上點兒, A.K.A 宇宙獨立標識(Universally Unique Identifier). UUID最初用在一個本屌沒聽過的網絡系統中, 而後被普遍應用到微軟抄作系統.面試
UUID是128位(長度固定)unsigned integer, 可以保證(真的假的?)在空間(Space)與時間(Time)上的惟一性。並且無需註冊機制保證, 能夠按需隨時生成。算法
據WIKI, 隨機算法生成的UUID的重複機率爲170億分之一網絡
因爲UUID定長且與時間有關, 有必定可能性UUID會重複出現(大概在西元(A.D)3400, 與具體實現算法有關)dom
UUID生成算法最高支持10,000,000(一千萬)每秒每臺機器, 因此能夠用做交易流水IDide
uuid(Python)和NSUUID(iOS)遵循本RFCui
[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
UUID採用Big-endian字節序排列
變量(variant), 或稱作類型, 4 bytes, 包括如下4種(其中X爲任意值):
0XX NCS兼容預留
10X RFC4122採用
110 微軟兼容預留
111 還未定義, 留做之後它用
版本號(version), 4 bytes, 一共如下5個版本:
0001 時間的版本
0010 DCE Security
0011 MD5哈希
0100 (僞)隨機數
0101 SHA-1哈希
時間戳(timestamp), 60bit:
版本1: 時間戳採用UTC時間,以100ns爲間隔,重1582年10月15日00:00:00.00開始計算
時鐘序列, 14bit:
版本1: 用來防止在時間回調的狀況下,致使的UUID重複問題
若是有時間回調(可能有系統斷電致使),若是生成器在回調時間以後有生成新的UUID,那麼時鐘序列應該改變, 若是新生成的UUID時鐘序列可知,那麼時鐘序列遞增便可; 若不可知, 那麼時鐘序列應重置到一個47位隨機數,或一個47位高質量的僞隨機數,而且第48位設置爲1,用來區別真正的MAC地址(因爲全部MAC地址在網卡中第48爲0)
節點(node), 48bit:
版本1: 爲主機MAC地址, 若主機有多個MAC地址,隨機選其中一個, 若系統沒有MAC地址, 則採用(僞)隨機數.
其餘版本請參考原文, 其中版本2沒有在原文中敘述
128位中,每一位都是零, (A.K.A)
urn:uuid:00000000-0000-0000-0000-000000000000
感謝您的大駕光臨, 不管您是習慣右手, 仍是左手點贊都木有關係, 若是本文對您有那麼丁點兒幫助, 請用您最銷魂的姿式點個贊. 若有問題請留言!