5.7. UUID Version 7
5.7. UUID Version 7
UUIDv7 具有从广泛实现且众所周知的 Unix 纪元时间戳源派生的时间排序值字段, 即自 1970 年 1 月 1 日午夜 UTC 以来的毫秒数, 不包括闰秒。通常, UUIDv7 比 UUIDv1 (第 5.1 节) 或 UUIDv6 (第 5.6 节) 具有改进的熵特性。
UUIDv7 值是通过在最高有效的 48 位中分配毫秒级的 Unix 时间戳, 并为生成的每个新 UUIDv7 用随机位填充剩余的 74 位 (不包括所需的版本和变体位) 来创建的, 以根据第 6.9 节提供唯一性。或者, 实现可以 (MAY) 联合使用以下子字段的组合填充 74 位, 按从最高有效位到最低有效位的顺序, 以保证毫秒内的额外单调性:
-
可选的子毫秒时间戳分数 (最多 12 位), 如第 6.2 节 (方法 3) 所述。
-
可选的仔细播种的计数器, 如第 6.2 节 (方法 1 或 2) 所述。
-
为任何剩余空间生成的每个新 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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 11: UUIDv7 字段和位布局
字段定义:
unix_ts_ms: 48 位大端无符号数, 表示以毫秒为单位的 Unix 纪元时间戳, 如第 6.1 节所述。占据位 0 到 47 (八位字节 0-5)。
ver: 第 4.2 节定义的 4 位版本字段, 设置为 0b0111 (7)。占据八位字节 6 的位 48 到 51。
rand_a: 12 位伪随机数据, 用于根据第 6.9 节提供唯一性 和/或 可选构造以根据第 6.2 节保证额外的单调性。占据位 52 到 63 (八位字节 6-7)。
var: 第 4.1 节定义的 2 位变体字段, 设置为 0b10。占据八位字节 8 的位 64 和 65。
rand_b: 最后 62 位伪随机数据, 用于根据第 6.9 节提供唯一性 和/或 可选计数器以根据第 6.2 节保证额外的单调性。占据位 66 到 127 (八位字节 8-15)。