4. UUID Format (UUID 格式)
4. UUID Format (UUID 格式)
UUID 格式大小为 16 个八位字节 (128 位); 变体位与下一节中描述的版本位一起确定更精细的结构。就这些 UUID 格式和布局而言, 位定义从 0 开始到 127 结束, 而八位字节定义从 0 开始到 15 结束。
在没有明确的应用程序或表示协议规范相反说明的情况下, 每个字段都以最高有效字节优先编码 (称为 "网络字节顺序")。
将 UUID 保存为二进制格式是通过以大端格式排列所有字段来完成的。但是, 有一个已知的警告, 即 Microsoft 的组件对象模型 (Component Object Model, COM) GUID 在保存 GUID 时利用小端。对此的讨论 (参见 [MS_COM_GUID]) 超出了本规范的范围。
UUID 可以表示为二进制数据或整数。当与 URN 一起使用或在应用程序中用作文本时, 任何给定的 UUID 都应由 "十六进制和短横线" 字符串格式表示, 该格式由多组大写或小写字母数字十六进制字符组成, 由单个短横线/连字符分隔。当与数据库一起使用时, 请参阅第 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] 的第 2.3 节, 字母字符可以全部大写、全部小写或大小写混合。图 1 显示了使用上述 ABNF 的此文本表示的示例 UUID。
f81d4fae-7dec-11d0-a765-00a0c91e6bf6
图 1: 示例字符串 UUID 格式
图 1 中的相同 UUID 以二进制 (图 2)、无符号整数 (图 3) 和由 [RFC8141] 定义的 URN (图 4) 表示。
111110000001110101001111101011100111110111101100000100011101000
01010011101100101000000001010000011001001000111100110101111110110
图 2: 示例二进制 UUID
329800735698586629295641978511506172918
图 3: 示例无符号整数 UUID (显示为十进制数)
urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6
图 4: UUID 的示例 URN 命名空间
有许多其他方法可以定义 UUID 格式; 下面详细介绍了一些示例。请注意, 这不是详尽的列表, 仅供参考。
- 一些 UUID 实现 (如 [Python] 和 [Microsoft] 中的实现) 将输出包含短横线的字符串格式的 UUID, 并用花括号括起来。
- [X667] 提供了用于在 OID 中使用 UUID 的 UUID 格式定义。
- [IBM_NCS] 是一个遗留实现, 它生成与表 1 的 Variant 0xx 兼容的唯一 UUID 格式。
4.1 Variant Field (变体字段)
变体字段确定 UUID 的布局。也就是说, UUID 中所有其他位的解释取决于变体字段中位的设置。因此, 它可以更准确地称为 "类型" 字段; 我们保留原始术语以保持兼容性。变体字段由 UUID 的八位字节 8 的可变数量的最高有效位组成。
表 1 列出了变体字段的内容, 其中字母 "x" 表示 "无关" 值。
| MSB0 | MSB1 | MSB2 | MSB3 | Variant | Description (描述) |
|---|---|---|---|---|---|
| 0 | x | x | x | 1-7 | 保留。网络计算系统 (NCS) 向后兼容, 包括第 5.9 节中的 Nil UUID。 |
| 1 | 0 | x | x | 8-9,A-B | 本文档中指定的变体。 |
| 1 | 1 | 0 | x | C-D | 保留。Microsoft Corporation 向后兼容。 |
| 1 | 1 | 1 | x | E-F | 为将来定义保留, 包括第 5.10 节中的 Max UUID。 |
表 1: UUID 变体
与此处定义的变体以外的变体的任何形式的互操作性都无法保证, 但在实践中不太可能成为问题。
具体来说, 对于本文档中的 UUID, UUID 的位 64 和 65 (八位字节 8 的位 0 和 1) 必须设置为 1 和 0, 如表 1 的第 2 行所指定。因此, 所有位和字段布局都避免使用这些位。
4.2 Version Field (版本字段)
版本号位于八位字节 6 的最高有效 4 位中 (UUID 的位 48 到 51)。
表 2 列出了本文档中指定的此 UUID 变体 10xx 的所有版本。
| MSB0 | MSB1 | MSB2 | MSB3 | Version | Description (描述) |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 未使用。 |
| 0 | 0 | 0 | 1 | 1 | 本文档中指定的基于格里高利时间的 UUID。 |
| 0 | 0 | 1 | 0 | 2 | 为 DCE 安全版本保留, 带有嵌入式 POSIX UUID。 |
| 0 | 0 | 1 | 1 | 3 | 本文档中指定的基于名称的版本, 使用 MD5 散列。 |
| 0 | 1 | 0 | 0 | 4 | 本文档中指定的随机或伪随机生成的版本。 |
| 0 | 1 | 0 | 1 | 5 | 本文档中指定的基于名称的版本, 使用 SHA-1 散列。 |
| 0 | 1 | 1 | 0 | 6 | 本文档中指定的重新排序的基于格里高利时间的 UUID。 |
| 0 | 1 | 1 | 1 | 7 | 本文档中指定的基于 Unix 纪元时间的 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 | 为将来定义保留。 |
表 2: 本规范定义的 UUID 变体 10xx 版本
UUIDv4 的示例版本/变体布局遵循表格, 其中 "M" 表示十六进制表示 0x4 (0b0100) 的版本位置, "N" 表示变体 10xx 的四个可能的十六进制表示之一的变体位置: 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
图 5: UUIDv4 变体示例
应该注意的是, 表 1 中发现的其他剩余 UUID 变体利用不同的子类型或版本控制机制。剩余 UUID 变体和子类型组合的记录和定义超出了本文档的范围。