UUID

Posted on Thu 08 December 2011 in 我用(IT)

通用唯一识别码 (Universally Unique Identifier, UUID)是一个软件建构的标准,亦为自由软件基金会 (Open Software Foundation, OSF)的组织在分散式计算环境 (Distributed Computing Environment, DCE)领域的一部份。

UUID的目的,是让分散式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的UUID。在这样的情况下,就不需考虑资料库建立时的名称重复问题。

1. 定义

一个UUID是由32个16进制数字所构成,所以UUID理论上的总数为2(4 x 32) =2^128,约等于3.4 x 10^38。也就是说若每奈秒(1ns=10^-9s)产生1兆个UUID,要花100亿年才会将所有UUID用完。

UUID的标准型式包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的32个字元。范例; 550e8400-e29b-41d4-a716-446655440000

2. 变体和版本

2.1. Version 1 (MAC address)

V1版由MAC地址和系统时钟生成的UUID,如果“由哪台机器在什么时间生成”属于机密信息,建议不用这个算法。

2.2. Version 2 (DCE Security)

V2版的UUIDs与V1版很接近,只是时钟信息部分被进程ID替换。

注意:Python中没有这个版本的实现。

2.3. Version 3 (MD5 hash)

V3版是根据计算一个命名空间和一个字串的MD5散列值得到,保证了同一命名空间中不同名字的唯一性和不同命名空间的唯一性,但同一命名空间的同一名字生成相同的UUID。

V3版都是这个样子的: xxxxxxxx-xxxx-3xxx-xxxx-xxxxxxxxxxxx 把一个命名空间的UUID转换成16进制数字,加上一个字串生成。

2.4. Version 4 (random)

V4版是纯粹随即生成

V4版的UUID的形式 XXXXXXXX - XXXX -4XXX- yxxx- XXXXXXXXXXXX 其中x是任何十六进制数字、Y是8,9,A或B。

2.5. Version 5 (SHA-1 hash)

和V3版类似,只是用了sha-1的算法,且把160位的哈希值截断为128位长度

3. 使用场景

如果用于生成随机数,V1、V4可以选择。主机信息和生成时间不是机密的情况下,推荐V1; 如果希望 不同命名空间下不重复,但同一命名空间的同一名字生成相同的uuid,则用V3或V5。

>>> import uuid
>>>
>>> # V1版由MAC地址和系统时钟生成的UUID
>>> uuid.uuid1()
UUID('3befa2b0-21a0-11e1-b619-001d7d9176ee')
>>>
>>> # V4版是纯粹随即生成
>>> uuid.uuid4()
UUID('b7b23537-ca51-4ec8-a668-c89ea4e68544')
>>>
>>> # V3版同一命名空间的同一名字生成相同的UUID
>>> myDN=uuid.uuid3(uuid.NAMESPACE_DNS,"li3huo.com")
>>> myDN1=uuid.uuid3(uuid.NAMESPACE_DNS,"li4huo.com")
>>> uuid.uuid3(myDN,"abc")
UUID('ad393a3e-f874-3ecc-a1bf-68a913037551')
>>> uuid.uuid3(myDN,"abc")
UUID('ad393a3e-f874-3ecc-a1bf-68a913037551')
>>> uuid.uuid3(myDN1,"abc")
UUID('ead5e633-abe6-3529-8b7b-623b5098c96a')
>>>
>>> # V5版和V3版类似,只是用了sha-1的算法
>>> uuid.uuid5(myDN,"abc")
UUID('452468b9-e5c6-58be-904e-75ebb3c353a6')
>>> uuid.uuid5(myDN,"abc")
UUID('452468b9-e5c6-58be-904e-75ebb3c353a6')
>>> uuid.uuid5(myDN1,"abc")
UUID('5aca2af0-4e07-505c-a736-f16e21681d65')

4. 随机UUID的重复机率

极低

5. Reference

http://en.wikipedia.org/wiki/Universally_unique_identifier