一、簡介
UUID,是Universally Unique Identifier的縮寫,UUID出現的目的,是為了讓分佈式系統可以不借助中心節點,就可以生成UUID來標識一些唯一的信息;
GUID,是Globally Unique Identifier的縮寫,跟UUID是同一個東西,只是來源於微軟。
二、格式
UUID是由一組32位數的16進制數字所構成,是故UUID理論上的總數為16^32 = 2^128,約等於3.4 x 10^38。也就是說若每納秒產生1兆個UUID,要花100億年才會將所有UUID用完。
UUID的標準型式包含32個16進制數字,以連字號分為五段,形式為8-4-4-4-12的32個字符,如:550e8400-e29b-41d4-a716-446655440000。
三、組成:
UUID是指在一臺機器上生成的數字,它保證對在同一時空中的所有機器都是唯一的。通常平臺會提供生成的API。按照開放軟件基金會(OSF)制定的標準計算,用到了以太網卡地址、納秒級時間、芯片ID碼和許多可能的數字。
- 當前日期和時間,UUID的第一個部分與時間有關,如果你在生成一個UUID之後,過幾秒又生成一個UUID,則第一個部分不同,其餘相同。
- 時鐘序列。
- 全局唯一的IEEE機器識別號,如果有網卡,從網卡MAC地址獲得,沒有網卡以其他方式獲得。
UUID的唯一缺陷在於生成的結果串會比較長。關於UUID這個標準使用最普遍的是微軟的GUID(Globals Unique Identifiers)。
四、UUID的版本
標準格式
UUID的格式是這樣的:xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
N那個位置,只會是8,9,a,b
M那個位置,代表版本號,由於UUID的標準實現有5個版本,所以只會是1,2,3,4,5
版本1:基於時間的UUID
通過當前時間戳、機器MAC地址生成;
由於在算法中使用了MAC地址,這個版本的UUID可以保證在全球範圍的唯一性。
但與此同時,因為它暴露了電腦的MAC地址和生成這個UUID的時間,這就是這個版本UUID被詬病的地方。
版本2:DCE安全的UUID
DCE安全的UUID和基於時間的UUID算法相同,但會把時間戳的前4位置換為POSIX的UID或GID。
不過,在UUID的規範裡面沒有明確地指定,所以基本上所有的UUID實現都不會實現這個版本。
版本3:基於名字空間的UUID(MD5)
由用戶指定1個namespace和1個具體的字符串,通過MD5散列,來生成1個UUID;
根據規範描述,這個版本的存在是為了向後兼容?平時這個版本我們也很少用到
版本4:基於隨機數的UUID
根據隨機數,或者偽隨機數生成UUID。這種UUID產生重複的概率是可以計算出來的,但隨機的東西就像是買彩票:你指望它發財是不可能的,但狗屎運通常會在不經意中到來。這個版本應該是平時大家無意中用得最多的版本了;
版本5:基於名字空間的UUID(SHA1)
和版本3一樣,不過散列函數換成了SHA1
五、版本選擇
- V4 - 首選
- V1 - 如果需要反向解析主機 Mac 地址
- V5 - 如果需要根據特定的值生成,而且在值不變的情況下生成的 UUID 不變。通知值很難破解出密碼原文。
- V3 - 不推薦,用 V5 替代
V2 - 一般不會用到
六、php代碼實現
閱讀更多 誰不曾年少輕狂 的文章