计算机科学

首页 > 计算机科学

通用唯一识别码

通用唯一识别码英语:Universally Unique Identifier,简称UUID)是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。

UUID的目的是让分布式系统中的所有元素都能有唯一的辨识信息,而不需要透过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。目前应用最广泛的UUID是微软公司的全局唯一标识符(GUID),而其他重要的应用,则有Linux ext2/ext3文件系统、LUKS加密分区、GNOME、KDE、macOS等。另外,也可以在e2fsprogs包中的UUID库找到实现。

目录

  • 1 定义
  • 2 格式
  • 3 随机UUID的重复机率
  • 4 参考文献
  • 5 参见

定义

UUID是由一组32位数的16进制数字所构成,是故UUID理论上的总数为1632=2128,约等于3.4 x 1038。也就是说若每纳秒产生1兆个UUID,要花100亿年才会将所有UUID用完。

UUID的标准型式包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的32个字符。示例:

550e8400-e29b-41d4-a716-446655440000

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变体。在例子中,M1 而且 Na(10xx),这意味着 UUID是变体一版本 UUID;即基于时间的 DCE/RFC 4122 UUID。

规范的 8-4-4-4-12 字符串格式基于 16个字节的 UUID“记录布局”:

UUID record layout
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的重复机率

随机产生的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并造成错误的情况非常低,是故大可不必考虑此问题。

机率也与随机数产生器的质量有关。若要避免重复机率提高,必须要使用基于密码学上的假随机数产生器来生成值才行。

参考文献

  1. ^ Old Farmer's Almanac 1994, 220-222, Taking your Chances: An Explanation of Risk

参见

  • 全局唯一标识符

下一篇:集合论
相关推荐