Universally Unique IDentifier 通用唯一标识符
src: RFC 4122 - A Universally Unique IDentifier (UUID) URN Namespace
计算机系统中用于生成唯一的 ID 的系统方法。
总的来说,就是从以下几个来源获取原始数据,生成唯一 id:
- 当前系统时间
- 当前系统的硬件环境标识符,例如 MAC 地址
- 自定义的命名空间,例如 DNS、URL 等
另外,使用SHA1或者MD5方法等计算哈希,保证原始信息不被泄露。
版本
UUID 版本号 | 生成方法 | 应用场景 |
---|---|---|
Version 1 | 基于时间戳生成,使用 60 位的时间戳(表示自 1582 年 10 月 15 日以来的 100 纳秒间隔数)、14 位的时钟序列和 48 位的节点字段(通常是 IEEE 802 MAC 地址)来确保唯一性。 | 时间排序的场景 |
Version 3 | 使用名称空间,例如 DNS、URL 等 | 适用于和名称空间相关的场景 |
Version 4 | 使用随机数或伪随机数生成 | 需要短时间内生成大量 id 的场景 |
Version 5 | 在 Version 3 中加入 SHA-1 等哈希算法保证安全性 | 对安全性有要求的场景 |
结构
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| time_low |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| time_mid | time_hi_and_version |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|clk_seq_hi_res | clk_seq_low | node (0-1) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| node (2-5) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- time_low, time_mid, time_hi_and_version,这三部分与时间戳有关
- cls_seq 表示“时钟序列”(Clock Sequence) ,可以随 uuid 生成的数量递增
- node 区域一般是 MAC 地址,IEEE 地址或者随机数
不过对于 uuid4 来说,仅有 bit6,7,12-15 是设定好的,其余部分都是随机生成。
冲突问题
一般来说 UUID 不会发生碰撞,但是对纯随机生成的数字,例如 UUID4 ,确实有冲突的可能,概率极低。
UUID4 使用 122 位随机数,50% 冲突概率大约需要 个 UUID。每秒 10 亿个,需要 85 年达到 50% 冲突概率。
然而如果来自硬件的伪随机数生成器的熵不足,也会造成 UUID,这点必须特别注意。