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,这点必须特别注意。