通用唯一識別碼(GUID)

來源:互聯網
上載者:User

標籤:

通用唯一識別碼,簡稱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的演算法通常都加入了非隨機的參數(如時間),以保證這種重複的情況不會發生。(見演算法章節)

目錄
  • 1 執行個體
  • 2 基本結構
  • 3 文本編碼
  • 4 演算法
  • 5 序列化演算法
  • 6 參考資料
  • 7 參見
  • 8 外部連結
執行個體
  • 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",如:

urn:uuid:3F2504E0-4F89-11D3-9A0C-0305E82C3301
演算法

在開放軟體基金會為計算(第一版)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].

通用唯一識別碼(GUID)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.