5.6. UUID Version 6 (UUID 版本 6)
5.6. UUID Version 6 (UUID 版本 6)
UUIDv6 是 UUIDv1 (第 5.1 节) 的字段兼容版本, 经过重新排序以改善数据库局部性。预计 UUIDv6 将主要在使用 UUIDv1 的环境中实现。不涉及遗留 UUIDv1 的系统应改用 UUIDv7 (第 5.7 节)。
UUIDv6 不是像 UUIDv1 那样将时间戳拆分为低位、中位和高位部分, 而是更改此序列, 以便时间戳字节从最高有效位到最低有效位存储。也就是说, 给定第 5.1 节中为 UUIDv1 指定的 60 位时间戳值, 对于 UUIDv6, 首先存储最高有效的 48 位, 然后是 4 位版本 (相同位置), 然后是原始 60 位时间戳的其余 12 位。
时钟序列和节点位与第 5.1 节中的位置保持不变。
对于生成的每个新 UUIDv6, 时钟序列和节点位应重置为伪随机值; 但是, 实现可以选择保留第 5.1 节中的旧时钟序列和 MAC 地址行为。有关 UUID 中 MAC 地址使用的更多信息, 请参见第 8 节。
16 字节 128 位 UUIDv6 的格式如图 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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 10: UUIDv6 字段和位布局
字段定义:
time_high: 60 位起始时间戳的最高有效 32 位。占用位 0 到 31 (八位组 0-3)。
time_mid: 60 位起始时间戳的中间 16 位。占用位 32 到 47 (八位组 4-5)。
ver: 由第 4.2 节定义的 4 位版本字段, 设置为 0b0110 (6)。占用八位组 6 的位 48 到 51。
time_low: 将包含 60 位起始时间戳中最低有效 12 位的 12 位。占用位 52 到 63 (八位组 6-7)。
var: 由第 4.1 节定义的 2 位变体字段, 设置为 0b10。占用八位组 8 的位 64 和 65。
clock_seq: 包含时钟序列的 14 位。占用位 66 到 79 (八位组 8-9)。
node: 48 位空间唯一标识符。占用位 80 到 127 (八位组 10-15)。
对于 UUIDv6, 将时间戳拆分为 time_high 和 time_mid 的步骤是可选的, 因为 time_high 和 time_mid 的 48 位将保持相同的顺序。当重用现有的 UUIDv1 实现时, 将时间戳的前 48 位拆分为最高有效 32 位和最低有效 16 位的额外步骤非常有用。