關(guān)于UUID的二三事

[TOC]

一源梭、簡(jiǎn)介

UUID荠卷,是Universally Unique Identifier的縮寫(xiě),UUID出現(xiàn)的目的顶吮,是為了讓分布式系統(tǒng)可以不借助中心節(jié)點(diǎn)湃交,就可以生成UUID來(lái)標(biāo)識(shí)一些唯一的信息;

GUID,是Globally Unique Identifier的縮寫(xiě)温圆,跟UUID是同一個(gè)東西膝蜈,只是來(lái)源于微軟瞬女。

規(guī)范定義

UUID來(lái)自于IETF發(fā)布的一個(gè)規(guī)范:A Universally Unique IDentifier (UUID) URN Namespace

UUID來(lái)源于OSF的DCE規(guī)范深浮,也就是RFC4122的前身

GUID來(lái)源于微軟菌瘫,注意RFC4122的作者之一是微軟員工

下面摘錄一下忿等,RFC4144中的Abstract

This specification defines a Uniform Resource Name namespace for
UUIDs (Universally Unique IDentifier), also known as GUIDs (Globally
Unique IDentifier).  A UUID is 128 bits long, and can guarantee
uniqueness across space and time.  UUIDs were originally used in the
Apollo Network Computing System and later in the Open Software
Foundation's (OSF) Distributed Computing Environment (DCE), and then
in Microsoft Windows platforms.

This specification is derived from the DCE specification with the
kind permission of the OSF (now known as The Open Group).
Information from earlier versions of the DCE specification have been
incorporated into this document.

不知道起什么標(biāo)題好

1個(gè)UUID是1個(gè)16字節(jié)(128位)的數(shù)字捐川;為了方便閱讀冷溶,通常將UUID表示成如下的方式:

123e4567-e89b-12d3-a456-426655440000

1個(gè)UUID被連字符分為五段,形式為8-4-4-4-12的32個(gè)字符襟诸。

其中的字母是16進(jìn)制表示澜驮,大小寫(xiě)無(wú)關(guān)。

二、不同的版本

UUID本身也經(jīng)過(guò)了多個(gè)版本的演化溅漾,每個(gè)版本的算法都不同缝龄。

標(biāo)準(zhǔn)格式

UUID的格式是這樣的:xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx

N那個(gè)位置,只會(huì)是8,9,a,b

M那個(gè)位置俺亮,代表版本號(hào)本讥,由于UUID的標(biāo)準(zhǔn)實(shí)現(xiàn)有5個(gè)版本撞芍,所以只會(huì)是1,2,3,4,5

各個(gè)版本簡(jiǎn)介

版本1:基于時(shí)間的UUID

通過(guò)當(dāng)前時(shí)間戳愉镰、機(jī)器MAC地址生成拔莱;

由于在算法中使用了MAC地址尊剔,這個(gè)版本的UUID可以保證在全球范圍的唯一性奶甘。

但與此同時(shí)钉赁,因?yàn)樗┞读穗娔X的MAC地址和生成這個(gè)UUID的時(shí)間,這就是這個(gè)版本UUID被詬病的地方。

在python里面的使用的例子:

>>> import uuid
>>> uuid.uuid1()
UUID('444b5cc0-ae5d-11e6-8d22-28924a431726')
>>> uuid.uuid1()
UUID('46a9bf21-ae5d-11e6-9549-28924a431726')

其中览绿,最后的12個(gè)字符28924a431726就是我電腦網(wǎng)卡的MAC地址

版本2:DCE安全的UUID

DCE安全的UUID和基于時(shí)間的UUID算法相同怀各,但會(huì)把時(shí)間戳的前4位置換為POSIX的UID或GID醇疼。

不過(guò),在UUID的規(guī)范里面沒(méi)有明確地指定,所以基本上所有的UUID實(shí)現(xiàn)都不會(huì)實(shí)現(xiàn)這個(gè)版本桑滩。

版本3:基于名字空間的UUID(MD5)

由用戶(hù)指定1個(gè)namespace和1個(gè)具體的字符串,通過(guò)MD5散列随橘,來(lái)生成1個(gè)UUID酿愧;

根據(jù)規(guī)范描述庞钢,這個(gè)版本的存在是為了向后兼容?平時(shí)這個(gè)版本我們也很少用到

在python里面的使用的例子:

>>> import uuid
>>> uuid.uuid3(uuid.NAMESPACE_DNS, "myString")
UUID('21fc48e5-63f0-3849-8b9d-838a012a5936')
>>> uuid.uuid3(uuid.NAMESPACE_DNS, "myString")
UUID('21fc48e5-63f0-3849-8b9d-838a012a5936')

在java中使用的例子

System.out.println(UUID.nameUUIDFromBytes("myString".getBytes("UTF-8")).toString());

Java只支持生成版本3和版本4的UUID

版本4:基于隨機(jī)數(shù)的UUID

根據(jù)隨機(jī)數(shù)夷恍,或者偽隨機(jī)數(shù)生成UUID。這種UUID產(chǎn)生重復(fù)的概率是可以計(jì)算出來(lái)的盖灸,但隨機(jī)的東西就像是買(mǎi)彩票:你指望它發(fā)財(cái)是不可能的,但狗屎運(yùn)通常會(huì)在不經(jīng)意中到來(lái)。這個(gè)版本應(yīng)該是平時(shí)大家無(wú)意中用得最多的版本了;

在python里面使用的例子:

>>> import uuid
>>> uuid.uuid4()
UUID('e584539d-a334-4f15-9819-88d73fcf707d')
>>> uuid.uuid4()
UUID('76ec02cc-1b1d-4ad3-bd09-a4f6d67c7af4')

以及Java中大家最熟悉的:

System.out.println(UUID.randomUUID().toString());
版本5:基于名字空間的UUID(SHA1)

和版本3一樣治拿,不過(guò)散列函數(shù)換成了SHA1

在python里面的使用的例子:

>>> import uuid
>>> uuid.uuid5(uuid.NAMESPACE_DNS, "myString")
UUID('cd086011-6aac-5a06-a94a-0b67c59649ba')
>>> uuid.uuid5(uuid.NAMESPACE_DNS, "myString")
UUID('cd086011-6aac-5a06-a94a-0b67c59649ba')

三、UUID的應(yīng)用

從幾個(gè)版本的定義來(lái)看,感覺(jué)都不是特別完美项棠,可能版本4是平時(shí)用得最多的税弃,但是在現(xiàn)實(shí)的業(yè)務(wù)場(chǎng)景中做修,考慮到可讀性、唯一性可都、長(zhǎng)度缓待,我們一般也不會(huì)選擇UUID當(dāng)做數(shù)據(jù)庫(kù)的主鍵蚓耽。

至于其他場(chǎng)景的應(yīng)用渠牲,可以結(jié)合具體的場(chǎng)景,來(lái)使用各個(gè)版本的實(shí)現(xiàn)步悠。

四签杈、UUID和各個(gè)編程語(yǔ)言

參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鼎兽,隨后出現(xiàn)的幾起案子答姥,更是在濱河造成了極大的恐慌,老刑警劉巖谚咬,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹦付,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡择卦,警方通過(guò)查閱死者的電腦和手機(jī)敲长,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)秉继,“玉大人祈噪,你說(shuō)我怎么就攤上這事∩屑” “怎么了辑鲤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)杠茬。 經(jīng)常有香客問(wèn)我月褥,道長(zhǎng),這世上最難降的妖魔是什么瓢喉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任宁赤,我火速辦了婚禮,結(jié)果婚禮上灯荧,老公的妹妹穿的比我還像新娘礁击。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布哆窿。 她就那樣靜靜地躺著链烈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挚躯。 梳的紋絲不亂的頭發(fā)上强衡,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音码荔,去河邊找鬼漩勤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛缩搅,可吹牛的內(nèi)容都是我干的越败。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼硼瓣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼究飞!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起堂鲤,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤亿傅,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后瘟栖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體葵擎,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年半哟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酬滤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡镜沽,死狀恐怖敏晤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情缅茉,我是刑警寧澤嘴脾,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站蔬墩,受9級(jí)特大地震影響译打,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拇颅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一奏司、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧樟插,春花似錦韵洋、人聲如沸竿刁。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)食拜。三九已至,卻和暖如春副编,著一層夾襖步出監(jiān)牢的瞬間负甸,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工痹届, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呻待,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓队腐,卻偏偏與公主長(zhǎng)得像蚕捉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子香到,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容