跳到主要内容

5.5. UUID Version 5

5.5. UUID Version 5

UUIDv5 用于根据 "names" 生成 UUID, 这些 "names" 取自某个 "namespace" 并在该 "namespace" 内唯一, 如 Section 6.5 所述.

UUIDv5 值通过对给定的 Namespace ID 值 (Section 6.6) 与所需名称值的拼接结果计算 SHA-1 散列 [FIPS180-4] 来创建; 在拼接之前, 二者都已按照其命名空间的标准或约定转换为规范八位组序列, 并采用网络字节序. 然后, SHA-1 值中最高有效、最左侧的 128 位用于填充 UUID 布局的全部 128 位, 而 SHA-1 输出中剩余的 32 个最低有效、最右侧位会被丢弃. 随后, UUID version 和 variant 按 Sections 4.2 和 4.1 的定义替换相应位. Appendix A.4 中可见这种位替换和丢弃多余位的示例.

关于在给定命名空间内选择所需名称规范格式的信息, 可在 Section 6.5 的 "A note on names" 标题下找到.

在某些场景中, 通常取决于组织安全策略, SHA-1 库可能不可用, 或可能被认为不安全而不适合使用. 因此, 可能希望生成从 SHA-256 或更新 SHA 方法派生的基于名称的 UUID. 这些基于名称的 UUID MUST NOT 使用 UUIDv5, 并且 MUST 位于 Section 5.8 定义的 UUIDv8 空间内. Appendix 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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 9: UUIDv5 字段和位布局

字段定义:

sha1_high: 布局的前 48 位填入计算所得 SHA-1 值中最高有效、最左侧的 48 位. 占据第 0 到 47 位 (八位组 0-5).

ver: Section 4.2 定义的 4 位 version 字段, 设置为 0b0101 (5). 占据第 6 个八位组的第 48 到 51 位.

sha1_mid: 布局中的另外 12 位, 由计算所得 SHA-1 值中紧随 sha1_high 之后的 16 位的最低有效、最右侧 12 位组成. 占据第 52 到 63 位 (八位组 6-7).

var: Section 4.1 定义的 2 位 variant 字段, 设置为 0b10. 占据第 8 个八位组的第 64 和 65 位.

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