通用唯一识别码(英语:Universally Unique Identifier,简称UUID)是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。
简介UUID的目的是让分布式系统中的所有元素都能有唯一的辨识信息,而不需要透过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。目前应用最广泛的UUID是微软公司的全局唯一标识符(GUID),而其他重要的应用,则有Linuxext2/ext3文件系统、LUKS加密分区、GNOME、KDE、macOS等。另外,也可以在e2fsprogs包中的UUID库找到实现。1
定义UUID是由一组32位数的16进制数字所构成,是故UUID理论上的总数为16=2,约等于3.4 x 10。也就是说若每纳秒产生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。1
格式在规范字符串格式中,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。2
随机UUID的重复机率随机产生的UUID(例如说由java.util.UUID类别产生的)的128个比特中,有122个比特是随机产生,4个比特在此版本('Randomly generated UUID')被使用,还有2个在其变体('Leach-Salz')中被使用。利用生日悖论,可计算出两笔UUID拥有相同值的机率约为
以下是以x=2计算出n笔UUID后产生碰撞的机率:
|| ||
与被陨石击中的机率比较的话,已知一个人每年被陨石击中的机率估计为170亿分之1,也就是说机率大约是0.00000000006 (6 x 10),等同于在一年内置立数十兆笔UUID并发生一次重复。换句话说,每秒产生10亿笔UUID,100年后只产生一次重复的机率是50%。如果地球上每个人都各有6亿笔UUID,发生一次重复的机率是50%。
产生重复UUID并造成错误的情况非常低,是故大可不必考虑此问题。
机率也与随机数产生器的品质有关。若要避免重复机率提高,必须要使用基于密码学上的假随机数产生器来生成值才行。2
本词条内容贡献者为:
王沛 - 副教授、副研究员 - 中国科学院工程热物理研究所