Skip to main content

5.5. UUID Version 5 (UUID 版本 5)

5.5. UUID Version 5 (UUID 版本 5)

UUIDv5 用于从某个 "命名空间" 中提取的 "名称" 生成 UUID, 并且这些名称在该命名空间内是唯一的, 如第 6.5 节所述。

UUIDv5 值通过计算给定命名空间 ID 值 (第 6.6 节) 与所需名称值连接后的 SHA-1 哈希 [FIPS180-4] 来创建, 在两者都已按其命名空间的标准或约定转换为八位组的规范序列后, 以网络字节顺序表示。然后使用 SHA-1 值中最高有效的左侧 128 位填充 UUID 布局的所有 128 位, 并丢弃 SHA-1 输出的其余 32 个最低有效的右侧位。然后, UUID 版本和变体替换各自的位, 如第 4.2 节和第 4.1 节所定义。此位替换和丢弃多余位的示例可在附录 A.4 中找到。

有关在给定命名空间内选择所需名称的规范格式的信息, 可在第 6.5 节标题为 "关于名称的说明" 的部分找到。

可能存在某些场景, 通常取决于组织安全策略, 其中 SHA-1 库可能不可用或可能被认为不安全使用。因此, 可能希望生成从 SHA-256 或更新的 SHA 方法派生的基于名称的 UUID。这些基于名称的 UUID 不得使用 UUIDv5, 并且必须在第 5.8 节定义的 UUIDv8 空间内。附录 B.2 中提供了用于 SHA-256 基于名称的 UUID 的 UUIDv8 说明性示例。

有关 SHA-1 安全考虑的更多信息, 请参见 [RFC6194]。

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| sha1_high |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| sha1_high | ver | sha1_mid |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var| sha1_low |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| sha1_low |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

图 9: UUIDv5 字段和位布局

字段定义:

sha1_high: 布局的前 48 位用计算出的 SHA-1 值中最高有效的左侧 48 位填充。占用位 0 到 47 (八位组 0-5)。

ver: 由第 4.2 节定义的 4 位版本字段, 设置为 0b0101 (5)。占用八位组 6 的位 48 到 51。

sha1_mid: 布局的另外 12 位, 由紧跟 sha1_high 之后的 16 位中最低有效的右侧 12 位组成, 来自计算出的 SHA-1 值。占用位 52 到 63 (八位组 6-7)。

var: 由第 4.1 节定义的 2 位变体字段, 设置为 0b10。占用八位组 8 的位 64 和 65。

sha1_low: 紧跟 var 字段之后的布局的最后 62 位, 通过跳过剩余 SHA-1 哈希的两个最高有效的左侧位, 然后使用接下来的 62 个最高有效的左侧位来填充。任何剩余的 SHA-1 位都将被丢弃且不使用。占用位 66 到 127 (八位组 8-15)。