通用唯一識別碼(英語:Universally Unique Identifier,簡稱UUID)是一種軟件建構(gòu)的標(biāo)準(zhǔn),亦為開放軟件基金會(huì)組織在分布式計(jì)算環(huán)境領(lǐng)域的一部分。
簡介UUID的目的是讓分布式系統(tǒng)中的所有元素都能有唯一的辨識信息,而不需要透過中央控制端來做辨識信息的指定。如此一來,每個(gè)人都可以創(chuàng)建不與其它人沖突的UUID。在這樣的情況下,就不需考慮數(shù)據(jù)庫創(chuàng)建時(shí)的名稱重復(fù)問題。目前應(yīng)用最廣泛的UUID是微軟公司的全局唯一標(biāo)識符(GUID),而其他重要的應(yīng)用,則有Linuxext2/ext3文件系統(tǒng)、LUKS加密分區(qū)、GNOME、KDE、macOS等。另外,也可以在e2fsprogs包中的UUID庫找到實(shí)現(xiàn)。1
定義UUID是由一組32位數(shù)的16進(jìn)制數(shù)字所構(gòu)成,是故UUID理論上的總數(shù)為16=2,約等于3.4 x 10。也就是說若每納秒產(chǎn)生1兆個(gè)UUID,要花100億年才會(huì)將所有UUID用完。
UUID的標(biāo)準(zhǔn)型式包含32個(gè)16進(jìn)制數(shù)字,以連字號分為五段,形式為8-4-4-4-12的32個(gè)字符。示例:
550e8400-e29b-41d4-a716-446655440000
UUID亦可刻意重復(fù)以表示同類。例如說微軟的COM中,所有組件皆必須實(shí)現(xiàn)出IUnknown接口,方法是產(chǎn)生一個(gè)代表IUnknown的UUID。無論是程序試圖訪問組件中的IUnknown接口,或是實(shí)現(xiàn)IUnknown接口的組件,只要IUnknown一被使用,皆會(huì)被引用至同一個(gè)ID:00000000-0000-0000-C000-000000000046。1
格式在規(guī)范字符串格式中,UUID 的十六個(gè)八位字節(jié)被表示為 32個(gè)十六進(jìn)制(基數(shù)16)數(shù)字,以連字號分隔的五組來顯示,形式為 8-4-4-4-12,總共有 36個(gè)字符(即三十二個(gè)英數(shù)字母和四個(gè)連字號)。例如:
123e4567-e89b-12d3-a456-426655440000
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
數(shù)字M的四位表示 UUID版本,數(shù)字N的一至三個(gè)最高有效位表示 UUID變體。在例子中,M是1而且N是a(10xx),這意味著 UUID是變體一版本 UUID;即基于時(shí)間的 DCE/RFC 4122 UUID。2
隨機(jī)UUID的重復(fù)機(jī)率隨機(jī)產(chǎn)生的UUID(例如說由java.util.UUID類別產(chǎn)生的)的128個(gè)比特中,有122個(gè)比特是隨機(jī)產(chǎn)生,4個(gè)比特在此版本('Randomly generated UUID')被使用,還有2個(gè)在其變體('Leach-Salz')中被使用。利用生日悖論,可計(jì)算出兩筆UUID擁有相同值的機(jī)率約為
以下是以x=2計(jì)算出n筆UUID后產(chǎn)生碰撞的機(jī)率:
|| ||
與被隕石擊中的機(jī)率比較的話,已知一個(gè)人每年被隕石擊中的機(jī)率估計(jì)為170億分之1,也就是說機(jī)率大約是0.00000000006 (6 x 10),等同于在一年內(nèi)置立數(shù)十兆筆UUID并發(fā)生一次重復(fù)。換句話說,每秒產(chǎn)生10億筆UUID,100年后只產(chǎn)生一次重復(fù)的機(jī)率是50%。如果地球上每個(gè)人都各有6億筆UUID,發(fā)生一次重復(fù)的機(jī)率是50%。
產(chǎn)生重復(fù)UUID并造成錯(cuò)誤的情況非常低,是故大可不必考慮此問題。
機(jī)率也與隨機(jī)數(shù)產(chǎn)生器的品質(zhì)有關(guān)。若要避免重復(fù)機(jī)率提高,必須要使用基于密碼學(xué)上的假隨機(jī)數(shù)產(chǎn)生器來生成值才行。2
本詞條內(nèi)容貢獻(xiàn)者為:
王沛 - 副教授、副研究員 - 中國科學(xué)院工程熱物理研究所