深入理解 UUID:结构、变体与版本差异全解析

博客园:https://www.cnblogs.com/emanjusaka
公众号:emanjusaka的编程栈
by emanjusaka from https://www.emanjusaka.com/archives/uuid-structure-variant-version 彼岸花开可奈何
本文为原创文章,可能会更新知识点以及修正文中的一些错误,全文转载请保留原文地址,避免产生因未即时修正导致的误导。
UUID,全称Universally Unique Identifier,即通用唯一识别码,是一种在分布式系统中为对象分配唯一标识符的标准方法。
可能的UUID数量为16^32,即2^128或约3.4x10^38(这是一个很大的数字!)。
一个标准的 UUID 可以分解为这几个部分:
时间戳低位-时间戳中位-时间戳高位和版本-变体和时钟序列-节点标识符
UUID 有不同的版本,下面我们来详细解释下不同版本之间的区别和特点。
UUID 的字符串格式与字节对应关系
UUID 的标准字符串格式是 8-4-4-4-12 共 36 个字符(包含 4 个连字符),对应 16 个字节(128 位)。
每个十六进制字符对应 4 个比特,2 个十六进制字符组成 1 个字节。
变体:
变体通过 UUID 的第 8 位(从 0 开始计数)来标识。
变体 0
最高位为 0,形式为:
0xxxxxxx
。早期由 NCS(Network Computing System)定义的 UUID 格式,现在很少使用
变体 1
最高两位为 10,形式为:
10xxxxxx
当前最常用的 UUID 格式,由 RFC 4122 定义,包括我们常见的版本 1 到 5
变体 2
最高三位为 110,形式为:
110xxxxx
微软定义的 UUID 格式,主要用于 Windows 系统
变体 3
最高三位为 111,形式为:
111xxxxx
为未来扩展预留,目前未使用
Version 1
基于时间戳版本。由时间戳、时钟序列、MAC 地址组成。
可反推出生成时间和设备信息(存在隐私风险)。
唯一性强,同一设备上不会重复。
Version 2
DCE 安全 UUID
类似于版本 1,但将时间戳低 32 位替换为本地安全标识符(UID/GID)。
Version 3
基于命名空间名称和名字的 MD5 散列结果。
相同命名空间 + 名称会生成相同 UUID
MD5 哈希存在碰撞风险(安全性较低)
Version 4
完全基于随机或伪随机数据生成,不依赖于时间戳和硬件地址。
浏览器和 nodejs 内置了 V4 的生成函数。
Version 5
与版本 3 类似,但使用 SHA-1 算法替换 MD5 进行散列计算。
相同命名空间 + 名称生成相同 UUID
SHA-1 安全性高于 MD5,碰撞风险极低
总结
现在我们常用的是版本 4,它使用随机数据生成,比较简单和安全。基本上不会重复(重复的概率很小)。
版本 1 和版本 2 会暴露 MAC 地址有安全风险。
需要从名称生成固定 UUID 时,优先选择版本 5。