1、簡介javascript
UUID,是Universally Unique Identifier的縮寫,UUID出現的目的,是爲了讓分佈式系統能夠不借助中心節點,就能夠生成UUID來標識一些惟一的信息;php
GUID,是Globally Unique Identifier的縮寫,跟UUID是同一個東西,只是來源於微軟。html
規範定義java
UUID來自於IETF發佈的一個規範:A Universally Unique IDentifier (UUID) URN Namespace。node
UUID來源於OSF的DCE規範,也就是RFC4122的前身python
GUID來源於微軟,注意RFC4122的做者之一是微軟員工mysql
下面摘錄一下,RFC4144中的Abstractlinux
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.android
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.
不知道起什麼標題好git
1個UUID是1個16字節(128位)的數字;爲了方便閱讀,一般將UUID表示成以下的方式:
123e4567-e89b-12d3-a456-426655440000
1個UUID被連字符分爲五段,形式爲8-4-4-4-12的32個字符。
其中的字母是16進製表示,大小寫無關。
2、不一樣的版本
UUID自己也通過了多個版本的演化,每一個版本的算法都不一樣。
標準格式
UUID的格式是這樣的:xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
N那個位置,只會是8,9,a,b
M那個位置,表明版本號,因爲UUID的標準實現有5個版本,因此只會是1,2,3,4,5
各個版本簡介
版本1:基於時間的UUID
經過當前時間戳、機器MAC地址生成;
因爲在算法中使用了MAC地址,這個版本的UUID能夠保證在全球範圍的惟一性。
但與此同時,由於它暴露了電腦的MAC地址和生成這個UUID的時間,這就是這個版本UUID被詬病的地方。
在python裏面的使用的例子:
import uuid uuid.uuid1() UUID('444b5cc0-ae5d-11e6-8d22-28924a431726') uuid.uuid1() UUID('46a9bf21-ae5d-11e6-9549-28924a431726')
其中,最後的12個字符28924a431726就是我電腦網卡的MAC地址
版本2:DCE安全的UUID
DCE安全的UUID和基於時間的UUID算法相同,但會把時間戳的前4位置換爲POSIX的UID或GID。
不過,在UUID的規範裏面沒有明確地指定,因此基本上全部的UUID實現都不會實現這個版本。
版本3:基於名字空間的UUID(MD5)
由用戶指定1個namespace和1個具體的字符串,經過MD5散列,來生成1個UUID;
根據規範描述,這個版本的存在是爲了向後兼容?平時這個版本咱們也不多用到
在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:基於隨機數的UUID
根據隨機數,或者僞隨機數生成UUID。這種UUID產生重複的機率是能夠計算出來的,但隨機的東西就像是買彩票:你期望它發財是不可能的,但狗屎運一般會在不經意中到來。這個版本應該是平時你們無心中用得最多的版本了;
在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同樣,不過散列函數換成了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')
3、UUID的應用
從幾個版本的定義來看,感受都不是特別完美,可能版本4是平時用得最多的,可是在現實的業務場景中,考慮到可讀性、惟一性、長度,咱們通常也不會選擇UUID當作數據庫的主鍵。
至於其餘場景的應用,能夠結合具體的場景,來使用各個版本的實現。
4、UUID和各個編程語言
微軟:http://msdn.microsoft.com/en-...
Linux:http://en.wikipedia.org/wiki/...
Android:http://developer.android.com/...
PHP:http://php.net/manual/en/func...
MySQL:http://dev.mysql.com/doc/refm...
Java:http://docs.oracle.com/javase...
nodejs - https://github.com/broofa/nod...
參考:
https://en.wikipedia.org/wiki...
https://github.com/simongong/...
http://www.blogjava.net/feely...