全域唯一識別碼
全域唯一識別碼(英語:GloballyUniqueIdentifier,縮寫:GUID;發音為 / ˈɡuːɪd / 抑是 / ˈɡwɪd /)是一種由演算法生成的唯一標識,通常表示成三十二个十六進位數字(零-九,A-F)組成的字串,如:{ 二十一 EC 二千空二十三分 AEA 鋪一千空六十九-A 二 DD 鋪八千空二 B 三石空三百空九 D },伊實質上是一个一百二十八位元長的二進位整數。GUID 一个詞有時陣嘛專指微軟嘿 UUID 標準的實現。
GUID 的主要目的是產生完全唯一的數字。佇理想的情形下,任何電腦佮電腦密集攏袂生兩个仝款 GUID。GUID 總數也夠大,達到了兩千一百二十八(三孵四 × 一千空三十八)個,所以隨機生做兩个相仝 GUID 的可能性是足細的,毋過並無替零。所以乎,用佇生成 GUID 的演算法通常攏加入非隨機的參數(如時間), 以保證這種重複的狀況袂發生。(見演算法章節)
實例
- Windows 作業系統使用 GUID 來標識 COM 物件中的類和介面。一个指令碼會當毋知影 DLL 的位置佮名直接通過 GUID 來啟用其中的類或者是物件。
- 英特爾 GUID 磁碟分割表使用 GUID 來標識硬碟佮分割區。
- 微軟乎 ActiveX 使用 UUID 來標識每一个無仝款的瀏覽器控制項。
基本結構
GUID 本質上是一个十六位元組(一百二十八个元)的這个二進位數,上捷看的結構如下:
資料四的位元組序佮 GUID 顯示做文字的結果仝款,若其他三个資料佇小端序的機器(如英特爾 CPU)頂懸著愛先轉換做大端序。
資料四的頭一个位元組的第一孵三个表示所使用的 GUID 變種類型:
資料三上懸的四位元表示版本號佮所使用的演算法。
文字編碼
GUID 通常會寫做十六進位數的字串,如:
- 三 F 兩千五百空四 E 空七四 F 八十九捧十一 D 三更九 A 零 C 抹三百空五 E 八十二 C 三千三百空一這種文字的表示包括了如下部份:
欲描述表示方法通常囥佇一對大括號內邊,如:
- { 三 F 兩千五百空四 E 空七四 F 八十九捧十一 D 三更九 A 零 C 抹三百空五 E 八十二 C 三千三百空一 }
當需要使用閣較少的字元表示 GUID 時,可能可能可以用 Base 六十四抑是 Ascii 八十五編碼。Base 六十四編碼的 GUID 有二十二-二十四字元,如:
- 七 QDBkvCA 一 + B 九 K / U 零 vrQx 一 A
- 七 QDBkvCA 一 + B 九 K / U 零 vrQx 一 A==
Ascii 八十五編碼後是二十字元,如:
- 五 : $ Hj : Pf \ 四 RLB 百分之九 kU \ Lj
佇咧 URN 中,GUID 頭一版的號名空間標識是 " uuid ",如:
- urn : uuid : 三 F 兩千五百空四 E 空七四 F 八十九捧十一 D 三更九 A 零 C 抹三百空五 E 八十二 C 三千三百空一
演算法
佇咧開放軟體基金會做計算(頭版)GUID 制定的演算法內底,使用者的網卡 MAC 位址予人用於計算 GUID 中上尾一組數字,所以就存在隱私問題,因為任何人攏會當通過檔案包含的 GUID 追溯到上頭建立這个檔案的電腦。這个漏洞捌予人用佇咧揣梅麗莎病毒的製作者的位置。佇其他幾組數字中,大多數是根據生成啦 GUID 的時間決定的。
咱會當過 GUID 中第三組數字的第一位是毋是一來判斷講伊敢是第一版的 GUID 算法生的,比如講 { 二 f 一 e 四 fc 空九八十一 fd-一一 da 鋪九千一百五十六刣三十六 a 零 f 八百七十六 a }。
第四版的 GUID 使用新的演算法,其產生的數字是一个偽亂數。伊成的 GUID 的第三組數字的第一位是四,如 { 三十八 a 五十二 be 四配九千三百五十二-四五十三 e-af 九十七孵五 c 三 b 四十四抹八千六百五十二 f 零 }。著 Windows API 中的 GUID 生成器所做密碼分析顯示,因為第四版的 GUID 無影真正隨機的,所以只要知影矣程式內底的全部狀態,就可能預測伊生成的頂一个佮後一个 GUID 的值。.
序列化演算法
GUID 已經廣泛使用資料庫表格的主鍵。因為主鍵需要用來做索引,所以就產生一个效能問題:做主鍵有夠隨機的時,新的記錄著愛插入去原有的索引中央,毋通干焦排佇最後。
為緩解這个問題並猶原提供有夠的隨機程度以避免 GUID 的重複,人就創造一寡新的演算法來生序列化的 GUID。
二空空二年八月,吉米尼爾森(Jimmy Nilsson)予出頭一種的方法,並講的是「COMB」(combined guid / timestamp,意思講:組合 GUID / 時間抽)。 伊將 GUID 中資料四的最後六位元組用系統時間的最低位替換。經測試,這對隨機性的影響足細的,但是有一个副作用即是其建立的時間會當對 GUID 中輕鬆還原。
自從 Microsoft SQL Server 二千空五版開始,軟軟仔佇咧 Transact-SQL 加入一个新的函式,叫做 NEWSEQUENTIALID ( ),用來生做主鍵增加的 GUID,毋過一旦侍服器重新啟動,其實再一遍生的 GUID 可能顛倒變細(但是猶原是保持唯一)。 這佇真大的程度提懸索引的效能,毋過並袂當保證所生成的 GUID 一直增加。這个函式產生的 GUID 真簡單就會當預測,所以無適合用佇安全目的。
二空空六年,一寡程式的設計師發現,佇咧一寡平台頂的 Oracle 軟體中,SYS \ _ GUID 函式能回序列化的 GUID。但是這實際上是一个 BUG 致使的。.
參考資料
參見
- 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 . 一 Object Identifier components " ( ITU-T Rec . X . 六百六十七 | ISO / IEC 九千八百三十四孵八 , technically compatible with IETF RFC 四千一百二十二 )
- 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