Биты Байты Название поля Порядок байтов Порядок байтов
(GUID) RFC 4122
32 4 Data1 Native Big
16 2 Data2 Native Big
16 2 Data3 Native Big
64 8 Data4 Big Big
Hoylen对enSO的回答略微松散,并附有社区的补充。UUID 变体编号未在 RFC 中定义,在此答案中,变体编号根据变体指示符中非零位的数量进行编号(如 Wikipedia 中所示)。
简而言之:没有区别,它们的意思是一样的。更新:虽然 GUID(来自 Microsoft)和 UUID(来自 RFC 4122)看起来相似并且用于相似的目的,但存在细微但有时很重要的差异。特别是,微软文档提到,一个 GUID 可以在任何位置包含任何十六进制数字,而 RFC 4122 要求
version
和的特定值variant
。它还提到 GUID 必须完全大写,而 UUID 必须“以小写形式输出并且在键入时不区分大小写”。这可能导致不同库之间的不兼容(示例)。(以下为答案原文)
将它们视为一个 16 字节(128 位)的值,该值是唯一的。Microsoft 称它们为 GUID,而其他所有人都称它们为 UUID。
UUID 规范的作者和微软自己目前都认为它们是同义词:
RFC 4122 指出UUID 是“也称为 GUID(全球唯一标识符)” ;
在ITU-T X.667 建议书、ISO/IEC 9834-8:2004 国际标准中:“UUID 也称为全球唯一标识符 (GUID),但本建议书不使用该术语”;
甚至微软在其文档中声明:“通用唯一标识符 (UUID) 一词有时在 Windows 协议规范中用作 GUID 的同义词”。
但是,真正正确的答案取决于“UUID”一词的确切含义。
第一部分取决于提问者说“UUID”时在想什么。
Microsoft 文档中暗示所有 UUID 都是有效的 GUID。但是,仍不清楚:任何 GUID 是否都是有效的 UUID?换句话说,UUID 只是 GUID 的一个子集,还是同一个集合?
在 RFC 4122 中,我们可以找到 UUID 的四个不同版本(“变体”)。这是因为在 UUID 规范出现之前就使用了这样的 16 字节标识符。在规范中,他们试图结合这些选项。根据第 4.1.1 节,选项包括:
选项 0 (
0xxx
) - 保留用于与过时的 Apollo 网络计算系统兼容;选项 1 (
10xx
) - 主要选项,在 RFC 4122 中有描述(有五个子选项,称为“版本”);选项 2 (
110x
) 保留用于向后兼容 Microsoft 系统;选项 3 (
111x
) 留作将来使用。根据 RFC 4122,所有 UUID 变体都是“真正的 UUID”,因此所有 GUID 也是 UUID。如果您从字面上回答“UUID 和 GUID 之间有什么区别”这个问题,那么根据 RFC,答案是 没有区别(但考虑到下面写的内容)。
但并非所有 GUID 都是变体 1 UUID(例如,Microsoft COM 的 GUID 是变体 2 UUID)。如果您回答“选项 1 的 GUID 和 UUID 之间是否存在差异”这个问题,那么答案是肯定的——它们可能不同。有人问关于 UUID 和 GUID 的问题可能不知道变种的存在,当他们说“UUID”时,他们隐含的只是版本 1 的 UUID(例如,他们听说过一些关于带有 MAC 地址 + 时间的 UUID 和关于随机 UUID,它们都是选项 1) 的两个版本。在这种情况下,答案是肯定的,有区别。
所以答案取决于提问者说“UUID”时的意思。他是指选项1的UUID还是一般的任何UUID?
第二部分取决于使用哪个规范作为 UUID 的定义。
让我们看一下ITU-T X.667 ISO/IEC 9834-8:2004,它应该完全符合 RFC 4122。第 11.2 条有一个额外的句子说(翻译):“所有符合本建议书的 UUID | 国际标准应具有变体位,八位字节 7 的位 7 设置为 1,八位字节 7 的位 6 设置为 0。” 翻译成人类语言,这意味着只有变体 1 UUID (
10xx
) 符合此标准。在这种情况下,并非所有 GUID 都对应于 ITU-T/ISO/IEC 所理解的 UUID。因此,真正的答案还取决于问题所暗示的 UUID 规范。如果我们谈论任何 UUID,而不仅仅是选项 1 UUID,那么GUID 和 IETF UUID (RFC 4122) 之间没有区别,但GUID 和 ITU-T/ISO/IEC UUID 之间存在区别!
二进制编码也可能不同。编码 GUID 时,可以更改前三个字段的字节顺序。这与 UUID 不同,UUID 总是只使用网络字节顺序(大端)。如果您需要将 UUID/GUID 编码为二进制形式,请仔细阅读 UUID/GUID 实现的有关字节序的文档。
Hoylen对enSO的回答略微松散,并附有社区的补充。UUID 变体编号未在 RFC 中定义,在此答案中,变体编号根据变体指示符中非零位的数量进行编号(如 Wikipedia 中所示)。