全局唯一標識符
全局唯一標識符(英語:Globally Unique Identifier,縮寫:GUID;發音為/ˈɡuːɪd/或/ˈɡwɪd/)是一種由算法生成的唯一標識,通常表示成32個16進制數字(0-9,A-F)組成的字符串,如:{21EC2020-3AEA-1069-A2DD-08002B30309D},它實質上是一個128位長的二進制整數。GUID一詞有時也專指微軟對UUID標準的實現。
GUID的主要目的是產生完全唯一的數字。在理想情況下,任何計算機和計算機集群都不會生成兩個相同的GUID。GUID的總數也足夠大,達到了2128(3.4×1038)個,所以隨機生成兩個相同GUID的可能性是非常小的,但並不為0。所以,用於生成GUID的算法通常都加入了非隨機的參數(如時間),以保證這種重複的情況不會發生。(見算法章節)
實例
- Windows操作系統使用GUID來標識COM對象中的類和界面。一個腳本可以不需知道DLL的位置和名字直接通過GUID來激活其中的類或對象。
- 英特爾的全局唯一標識分區表使用GUID來標識硬盤和分區。
- 微軟的ActiveX使用UUID來標識每一個不同的瀏覽器控件。
基本結構
GUID本質上是一個16字節(128位)的二進制數,最常見[1]的結構如下:
位 | 字節 | 描述 | 字節序 |
---|---|---|---|
32 | 4 | 數據1 | 原生 |
16 | 2 | 數據2 | 原生 |
16 | 2 | 數據3 | 原生 |
64 | 8 | 數據4 | 大端序 |
數據4的字節序和GUID顯示成文本的結果相同,而其它3個數據在小端序的機器(如英特爾的CPU)上必須先轉換成大端序。
數據4的第一個字節的第1-3位表示所使用的GUID變種類型:
模式 | 描述 |
---|---|
0 | 向後兼容網絡計算系統 |
10 | 標準 |
110 | 向後兼容微軟組件對象模型 |
111 | 保留至將來使用 |
數據3最高的4位表示版本號和所使用的算法。
文本編碼
GUID通常會寫成16進制數的字符串,如:
- 3F2504E0-4F89-11D3-9A0C-0305E82C3301
這種文本表示包括了如下部分:
16進制數的位數 | 描述 |
---|---|
8 | 數據1 |
4 | 數據2 |
4 | 數據3 |
4 | 數據4的最初2字節 |
12 | 數據4的剩餘6字節 |
上述表示方法通常放在一對大括號裡邊,如:
- {3F2504E0-4F89-11D3-9A0C-0305E82C3301}
當需要使用更少的字符表示GUID時,可能會使用Base64或Ascii85編碼。Base64編碼的GUID有22-24個字符,如:
- 7QDBkvCA1+B9K/U0vrQx1A
- 7QDBkvCA1+B9K/U0vrQx1A==
Ascii85編碼後是20個字符,如:
- 5:$Hj:Pf\4RLB9%kU\Lj
在URN中,GUID第一版的名字空間標識是"uuid",如:
算法
在開放軟件基金會為計算(第一版)GUID制定的算法中,用戶的網卡MAC地址被用於計算GUID中最後一組數字,所以就存在隱私問題,因為任何人都可以通過文件包含的GUID追溯到最初創建這個文件的電腦。這個漏洞曾被用於尋找梅麗莎病毒的製作者的位置[2]。在其它幾組數字中,大多數是根據生成GUID的時間決定的。
我們可以通過GUID中第三組數字的第一位是不是1來判斷它是否是第一版的GUID算法生成的,例如{2f1e4fc0-81fd-11da-9156-00036a0f876a}。
第四版的GUID使用了新的算法,其產生的數字是一個偽隨機數。它生成的GUID的第三組數字的第一位是4,如{38a52be4-9352-453e-af97-5c3b448652f0}。對Windows API中的GUID生成器所做密碼分析顯示,因為第四版的GUID並不是真正隨機的,所以只要知道了程序內部的全部狀態,就可能預測它生成的上一個和下一個GUID的值。[3].
序列化算法
GUID已經廣泛使用於數據庫表格的主鍵。由於主鍵需要用作索引,於是就產生了一個性能問題:當主鍵足夠隨機時,新的記錄就必須插入到原有的索引中間,而不能僅僅排在最後。
為緩解這個問題並仍然提供足夠的隨機程度以避免GUID的重複,人們就創造了一些新的算法來生成序列化的GUID。
2002年8月,吉米尼爾森(Jimmy Nilsson)給出了第一種方法,[4]並稱之為「COMB」(combined guid/timestamp,意思是:組合GUID/時間戳)。他將GUID中數據4的最後6字節用系統時間的最低位替換。經測試,這對隨機性的影響很小,但是有一個副作用即是其創建的時間可以從GUID中輕鬆還原。
自從Microsoft SQL Server 2005版開始,微軟在Transact-SQL中加入了一個新函數,叫做NEWSEQUENTIALID()[5],用來生成主鍵增大的GUID,但一旦服務器重新啟動,其再次生成的GUID可能反而變小(但仍然保持唯一)。這在很大程度上提高了索引的性能,但並不能保證所生成的GUID一直增大。這個函數產生的GUID很簡單就可以預測,因此不適合用於安全目的。
2006年,一些程序員發現,在一些平台上的Oracle軟件中,SYS_GUID函數能返回序列化的GUID。但這個實際上是一個BUG導致的。[6].
參考資料
- ^ 存档副本. [2010-06-27]. (原始內容存檔於2010-06-23).
- ^ Tracking Melissa's alter egos (新聞稿). ZDNet. 1999-04-02 [2010-06-27]. (原始內容存檔於2012-10-21).
- ^ Design and Cryptanalysis of UUID-generator in Windows. [2010-06-27]. (原始內容存檔於2010-05-31).
- ^ InformIT. [2010-06-27]. (原始內容存檔於2010-08-26).
- ^ MSDN. [2010-06-27]. (原始內容存檔於2010-06-06).
- ^ 存档副本. [2010-06-27]. (原始內容存檔於2011-07-08).
參見
- UUID
- Security Identifier (SID)
- Object identifier (OID)
- 裝置指紋
外部連結
- CLSID Registry Key Information(頁面存檔備份,存於網際網路檔案館)
- International Standard "Generation and registration of Universally Unique Identifiers (UUIDs) and their use as ASN.1 Object Identifier components"(頁面存檔備份,存於網際網路檔案館) (ITU-T Rec. X.667 | ISO/IEC 9834-8, technically compatible with IETF RFC 4122)
- DmaId for InstanceId Values (DCE Universally Unique IDentifiers, UUIDs)
- Syntax and semantics of the DCE variant of Universal Unique Identifiers (UUIDs)(頁面存檔備份,存於網際網路檔案館)
- Generate and parse UUIDs (or GUIDs) in Java(頁面存檔備份,存於網際網路檔案館)
- UUID Generator on the ITU-T website(頁面存檔備份,存於網際網路檔案館)