Algorithm/UUID

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

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

1. 定义

一个UUID是由32个16进制数字所构成,所以UUID理论上的总数为2(4 x 32) =2128,约等于3.4 x 1038。也就是说若每奈秒(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)

Version 3 UUIDs use a scheme deriving a UUID via MD5 from a URL, a fully qualified domain name, an object identifier, a distinguished name (DN as used in Lightweight Directory Access Protocol), or on names in unspecified namespaces. Version 3 UUIDs have the form 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。

>>> myDN=uuid.uuid3(uuid.NAMESPACE_DNS,"myDN")
>>> myDN1=uuid.uuid3(uuid.NAMESPACE_DNS,"myDN1")
>>> 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')

4. 随机UUID的重复机率

极低

5. Reference

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


CategoryAlgorithm

MainWiki: UUID (last edited 2011-12-02 00:31:13 by twotwo)