5.6. UUID 版本 6
5.6. UUID 版本 6
UUIDv6 是 UUIDv1 (Section 5.1) 的字段兼容版本, 经过重新排序以改善 DB 局部性. 预期 UUIDv6 将主要在使用 UUIDv1 的上下文中实现. 不涉及遗留 UUIDv1 的系统 SHOULD 改用 UUIDv7 (Section 5.7).
UUIDv1 将时间戳拆分为 low, mid 和 high 几个部分, 而 UUIDv6 改变了这个顺序, 使时间戳字节按从最高有效到最低有效的顺序存储. 也就是说, 对于 Section 5.1 中为 UUIDv1 指定的 60-bit 时间戳值, UUIDv6 会先存储最高有效的 48 bit, 随后是 4-bit 版本字段 (位置相同), 再随后是原始 60-bit 时间戳剩余的 12 bit.
clock sequence 和 node bit 相对于 Section 5.1 中的位置保持不变.
对于每个新生成的 UUIDv6, clock sequence 和 node bit SHOULD 重置为伪随机值; 但是, 实现 MAY 选择保留 Section 5.1 中旧的 clock sequence 和 MAC 地址行为. 关于 UUID 中 MAC 地址用法的更多信息, 见 Section 8.
16-byte, 128-bit UUIDv6 的格式如 Figure 10 所示.
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_high |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| time_mid | ver | time_low |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var| clock_seq | node |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| node |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 10: UUIDv6 字段和位布局
字段定义:
time_high: 60-bit 起始时间戳的最高有效 32 bit. 占用 bit 0 到 31 (octet 0-3).
time_mid: 60-bit 起始时间戳的中间 16 bit. 占用 bit 32 到 47 (octet 4-5).
ver: Section 4.2 定义的 4-bit version 字段, 设为 0b0110 (6). 占用 octet 6 的 bit 48 到 51.
time_low: 12 bit, 包含 60-bit 起始时间戳的最低有效 12 bit. 占用 bit 52 到 63 (octet 6-7).
var: Section 4.1 定义的 2-bit variant 字段, 设为 0b10. 占用 octet 8 的 bit 64 和 65.
clock_seq: 包含 clock sequence 的 14 bit. 占用 bit 66 到 79 (octet 8-9).
node: 48-bit 空间唯一标识符. 占用 bit 80 到 127 (octet 10-15).
对于 UUIDv6, 将时间戳拆分为 time_high 和 time_mid 的步骤是 OPTIONAL, 因为 time_high 和 time_mid 的 48 bit 将保持相同顺序. 在复用现有 UUIDv1 实现时, 额外执行一步, 将时间戳的前 48 bit 拆分为最高有效的 32 bit 和最低有效的 16 bit, 会很有用.