通用唯一识别码(英语:Universally Unique Identifier,简称UUID)是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。
UUID的目的是让分布式系统中的所有元素都能有唯一的辨识信息,而不需要透过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。目前应用最广泛的UUID是微软公司的全局唯一标识符(GUID),而其他重要的应用,则有Linux ext2/ext3文件系统、LUKS加密分区、GNOME、KDE、macOS等。另外,也可以在e2fsprogs包中的UUID库找到实现。
UUID是由一组32位数的16进制数字所构成,是故UUID理论上的总数为1632=2128,约等于3.4 x 1038。也就是说若每纳秒产生1兆个UUID,要花100亿年才会将所有UUID用完。
UUID的标准型式包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的32个字符。示例:
UUID亦可刻意重复以表示同类。例如说微软的COM中,所有组件皆必须实现出IUnknown接口,方法是产生一个代表IUnknown的UUID。无论是程序试图访问组件中的IUnknown接口,或是实现IUnknown接口的组件,只要IUnknown一被使用,皆会被参考至同一个ID:00000000-0000-0000-C000-000000000046。
在规范字符串格式中,UUID 的十六个八位字节被表示为 32个十六进制(基数16)数字,以连字号分隔的五组来显示,形式为 8-4-4-4-12,总共有 36个字符(即三十二个英数字母和四个连字号)。例如:
123e4567-e89b-12d3-a456-426655440000
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
数字 M
的四位表示 UUID版本,数字 N
的一至三个最高有效位表示 UUID变体。在例子中,M是 1
而且 N 是 a
(10xx
),这意味着 UUID是变体一版本 UUID;即基于时间的 DCE/RFC 4122 UUID。
规范的 8-4-4-4-12 字符串格式基于 16个字节的 UUID“记录布局”:
Name | Length (bytes) | Length (hex digits) | Contents |
---|---|---|---|
time_low | 4 | 8 | integer giving the low 32 bits of the time |
time_mid | 2 | 4 | integer giving the middle 16 bits of the time |
time_hi_and_version | 2 | 4 | 4-bit "version" in the most significant bits, followed by the high 12 bits of the time |
clock_seq_hi_and_res clock_seq_low | 2 | 4 | 1-3 bit "variant" in the most significant bits, followed by the 13-15 bit clock sequence |
node | 6 | 12 | the 48-bit node id |
这些字段与版本一和二中基于时间的 UUID相对应,但所有 UUID都使用相同的 8-4-4-4-12表示法,即使对于构造不同的 UUID也是如此。
Microsoft GUID有时用周围的大括号表示:
{123e4567-e89b-12d3-a456-426655440000}
这种格式不应与“Windows登录表”相混淆,该格式引用大括号内的格式。
RFC 4122为 UUID 定义了统一资源名称(URN)名称空间。呈现为 URN的 UUID显示如下:
urn:uuid:123e4567-e89b-12d3-a456-426655440000
随机产生的UUID(例如说由java.util.UUID类别产生的)的128个比特中,有122个比特是随机产生,4个比特在此版本('Randomly generated UUID')被使用,还有2个在其变体('Leach-Salz')中被使用。利用生日悖论,可计算出两笔UUID拥有相同值的机率约为
以下是以x=2122计算出n笔UUID后产生碰撞的机率:
n | 机率 |
---|---|
68,719,476,736 = 236 | 0.0000000000000004 (4 x 10-16) |
2,199,023,255,552 = 241 | 0.0000000000004 (4 x 10-13) |
70,368,744,177,664 = 246 | 0.0000000004 (4 x 10-10) |
与被陨石击中的机率比较的话,已知一个人每年被陨石击中的机率估计为170亿分之1[1],也就是说机率大约是0.00000000006 (6 x 10-11),等同于在一年内置立数十兆笔UUID并发生一次重复。换句话说,每秒产生10亿笔UUID,100年后只产生一次重复的机率是50%。如果地球上每个人都各有6亿笔UUID,发生一次重复的机率是50%。
产生重复UUID并造成错误的情况非常低,是故大可不必考虑此问题。
机率也与随机数产生器的质量有关。若要避免重复机率提高,必须要使用基于密码学上的假随机数产生器来生成值才行。