4. UUID 格式
4. UUID 格式
UUID 格式大小为 16 个八位组 (128 位); variant 位与后续章节描述的 version 位共同决定更细的结构. 对于这些 UUID 格式和布局, 位定义从 0 开始并在 127 结束, 八位组定义从 0 开始并在 15 结束.
在没有明确的应用程序或表示协议规范作相反规定时, 每个字段都以最高有效字节优先的方式编码 (称为 "network byte order").
将 UUID 保存为二进制格式时, 会按大端格式对所有字段进行排序. 不过, 有一个已知注意事项: Microsoft 的 Component Object Model (COM) GUIDs 在保存 GUIDs 时使用小端格式. 对此的讨论 (见 [MS_COM_GUID]) 超出本规范范围.
UUID 可以表示为二进制数据或整数. 当与 URNs 一起使用, 或作为应用程序中的文本使用时, 任意给定 UUID 应表示为 "hex-and-dash" 字符串格式, 该格式由多组大写或小写的字母数字十六进制字符组成, 各组之间以单个短横线/连字符分隔. 与数据库一起使用时, 请参见 Section 6.13.
UUID 字符串表示的形式化定义由以下 ABNF [RFC5234] 给出:
UUID = 4hexOctet "-"
2hexOctet "-"
2hexOctet "-"
2hexOctet "-"
6hexOctet
hexOctet = HEXDIG HEXDIG
DIGIT = %x30-39
HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
注意, 根据 [RFC5234] Section 2.3, 字母字符可以全部大写、全部小写或大小写混合. Figure 1 展示了一个使用上述 ABNF 文本表示的示例 UUID.
f81d4fae-7dec-11d0-a765-00a0c91e6bf6
Figure 1: 示例字符串 UUID 格式
Figure 1 中的同一个 UUID 还可表示为二进制 (Figure 2)、无符号整数 (Figure 3), 以及由 [RFC8141] 定义的 URN (Figure 4).
111110000001110101001111101011100111110111101100000100011101000
01010011101100101000000001010000011001001000111100110101111110110
Figure 2: 示例二进制 UUID
329800735698586629295641978511506172918
Figure 3: 示例无符号整数 UUID (以十进制数字显示)
urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6
Figure 4: UUID 的示例 URN 命名空间
还有许多其他方式可以定义 UUID 格式; 下面详细列出一些示例. 请注意, 这不是详尽列表, 仅供参考.
- 某些 UUID 实现, 例如 [Python] 和 [Microsoft] 中的实现, 会输出带短横线的字符串格式 UUID, 并用花括号括起.
- [X667] 提供了将 UUID 与 OID 一起使用时的 UUID 格式定义.
- [IBM_NCS] 是一种遗留实现, 会生成与 Table 1 中 Variant 0xx 兼容的唯一 UUID 格式.
4.1. Variant 字段
variant 字段决定 UUID 的布局. 也就是说, UUID 中所有其他位的解释取决于 variant 字段中各位的设置. 因此, 它更准确地说可以称为 "type" 字段; 为保持兼容性, 我们保留原术语. variant 字段由 UUID 第 8 个八位组中数量可变的最高有效位组成.
Table 1 列出了 variant 字段的内容, 其中字母 "x" 表示 "don't-care" 值.
| MSB0 | MSB1 | MSB2 | MSB3 | Variant | 描述 |
|---|---|---|---|---|---|
| 0 | x | x | x | 1-7 | 保留. 向后兼容 Network Computing System (NCS), 并包含 Section 5.9 中的 Nil UUID. |
| 1 | 0 | x | x | 8-9,A-B | 本文档指定的 variant. |
| 1 | 1 | 0 | x | C-D | 保留. 向后兼容 Microsoft Corporation. |
| 1 | 1 | 1 | x | E-F | 保留供未来定义, 并包含 Section 5.10 中的 Max UUID. |
Table 1: UUID Variants
与本文所定义 variant 之外的其他 variant 的任何形式互操作性都不保证, 但在实践中不太可能成为问题.
具体到本文档中的 UUID, UUID 的第 64 和 65 位 (第 8 个八位组的第 0 和 1 位) MUST 按 Table 1 第 2 行所指定设置为 1 和 0. 因此, 所有位和字段布局都避免使用这些位.
4.2. Version 字段
version 编号位于第 6 个八位组的最高有效 4 位中 (UUID 的第 48 到 51 位).
Table 2 列出了本文档指定的 UUID variant 10xx 的所有版本.
| MSB0 | MSB1 | MSB2 | MSB3 | Version | 描述 |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 未使用. |
| 0 | 0 | 0 | 1 | 1 | 本文档指定的基于 Gregorian 时间的 UUID. |
| 0 | 0 | 1 | 0 | 2 | 保留给 DCE Security version, 带嵌入式 POSIX UUIDs. |
| 0 | 0 | 1 | 1 | 3 | 本文档指定的基于名称的版本, 使用 MD5 散列. |
| 0 | 1 | 0 | 0 | 4 | 本文档指定的随机或伪随机生成版本. |
| 0 | 1 | 0 | 1 | 5 | 本文档指定的基于名称的版本, 使用 SHA-1 散列. |
| 0 | 1 | 1 | 0 | 6 | 本文档指定的重新排序的基于 Gregorian 时间的 UUID. |
| 0 | 1 | 1 | 1 | 7 | 本文档指定的基于 Unix Epoch 时间的 UUID. |
| 1 | 0 | 0 | 0 | 8 | 保留给本文档指定的自定义 UUID 格式. |
| 1 | 0 | 0 | 1 | 9 | 保留供未来定义. |
| 1 | 0 | 1 | 0 | 10 | 保留供未来定义. |
| 1 | 0 | 1 | 1 | 11 | 保留供未来定义. |
| 1 | 1 | 0 | 0 | 12 | 保留供未来定义. |
| 1 | 1 | 0 | 1 | 13 | 保留供未来定义. |
| 1 | 1 | 1 | 0 | 14 | 保留供未来定义. |
| 1 | 1 | 1 | 1 | 15 | 保留供未来定义. |
Table 2: 本规范定义的 UUID Variant 10xx 版本
表后给出了一个 UUIDv4 的 version/variant 布局示例, 其中 "M" 表示十六进制表示 0x4 (0b0100) 的 version 位置, "N" 表示 variant 10xx 的四种可能十六进制表示之一的 variant 位置: 0x8 (0b1000)、0x9 (0b1001)、0xA (0b1010)、0xB (0b1011).
00000000-0000-4000-8000-000000000000
00000000-0000-4000-9000-000000000000
00000000-0000-4000-A000-000000000000
00000000-0000-4000-B000-000000000000
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
Figure 5: UUIDv4 Variant 示例
需要注意的是, Table 1 中剩余的其他 UUID variant 使用不同的子类型化或版本化机制. 记录和定义剩余 UUID variant 与子类型组合超出本文档范围.