5.7. UUID 版本 7
5.7. UUID 版本 7
UUIDv7 包含一个按时间排序的值字段, 该字段派生自广泛实现且广为人知的 Unix Epoch 时间戳源, 即自 1970 年 1 月 1 日 UTC 午夜以来经过的毫秒数, 不包括闰秒. 一般来说, UUIDv7 的熵特性优于 UUIDv1 (Section 5.1) 或 UUIDv6 (Section 5.6).
UUIDv7 值通过以下方式创建: 在最高有效的 48 bit 中分配一个以毫秒为单位的 Unix 时间戳, 并在剩余 74 bit 中填充每个新生成 UUIDv7 的随机 bit 以按 Section 6.9 提供唯一性, 但不包括必需的 version 和 variant bit. 或者, 实现 MAY 按照从最高有效 bit 到最低有效 bit 的顺序, 将以下子字段组合起来共同填充这 74 bit, 以保证同一毫秒内的额外单调性:
-
按 Section 6.2 (Method 3) 的 OPTIONAL 亚毫秒时间戳小数部分 (最大 12 bit).
-
按 Section 6.2 (Method 1 或 2) 的 OPTIONAL 精心播种计数器.
-
为每个新生成 UUIDv7 在任何剩余空间中填充的随机数据.
如有可能, 实现 SHOULD 使用 UUIDv7, 而不是 UUIDv1 和 UUIDv6.
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| unix_ts_ms |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| unix_ts_ms | ver | rand_a |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var| rand_b |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| rand_b |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 11: UUIDv7 字段和位布局
字段定义:
unix_ts_ms: 按 Section 6.1 的 Unix Epoch 时间戳毫秒值, 为 48-bit big-endian 无符号数. 占用 bit 0 到 47 (octet 0-5).
ver: Section 4.2 定义的 4-bit version 字段, 设为 0b0111 (7). 占用 octet 6 的 bit 48 到 51.
rand_a: 12 bit 伪随机数据, 用于按 Section 6.9 提供唯一性, 和/或按 Section 6.2 提供用于保证额外单调性的可选构造. 占用 bit 52 到 63 (octet 6-7).
var: Section 4.1 定义的 2-bit variant 字段, 设为 0b10. 占用 octet 8 的 bit 64 和 65.
rand_b: 最后的 62 bit 伪随机数据, 用于按 Section 6.9 提供唯一性, 和/或作为按 Section 6.2 保证额外单调性的可选计数器. 占用 bit 66 到 127 (octet 8-15).