GUID 和 UUID 有什么区别吗?

我看到这两个首字母缩略词乱七八糟,我想知道 GUID 和 UUID 之间是否有任何区别?

答案

简单的答案是: 没有区别 ,它们是同一回事。将它们视为一个 16 字节(128 位)的值,用作唯一值。在 Microsoft 语言中,它们称为 GUID,但在不使用 Microsoft 语言时,它们称为 UUID。

甚至 UUID 规范的作者和 Microsoft 都声称它们是同义词:

  • 从 IETF RFC 4122 的简介通用唯一标识符(UUID)URN 命名空间 ”:“用于 UUID(通用唯一标识符)的统一资源名称命名空间,也称为 GUID(全局唯一标识符)。”

  • ITU-T X.667 建议书,ISO / IEC 9834-8:2004 国际标准开始 :“UUID 也被称为全局唯一标识符(GUID),但在本建议书中未使用该术语。”

  • 微软甚至声称 GUID 由 UUID RFC 指定:“在 Microsoft Windows 编程和 Windows 操作系统中,[RFC4122] 中指定的全局唯一标识符(GUID)为... 术语 “通用唯一标识符(UUID)”。 )有时在 Windows 协议规范中用作 GUID 的同义词。”

但是正确的答案取决于当问题提示 “UUID” 时意味着什么...

第一部分取决于提问者说 “UUID” 时的想法。

Microsoft 的声明暗示所有 UUID 都是 GUID。但是,所有 GUID 都是真正的 UUID 吗?也就是说,所有 UUID 的集合只是所有 GUID 的集合的适当子集,还是完全相同的集合?

查看 RFC 4122 的细节,有四个不同的 UUID“变体”。这主要是因为在创建 UUID 规范之前,已经使用了 16 个字节的标识符。从RFC 4122 的 4.1.1 节开始,UUID 的四个变体是:

  1. 保留,网络计算系统向后兼容
  2. RFC 4122 中指定的变体 (其中有五个子变体,称为 “版本”)
  3. 保留,Microsoft Corporation 向后兼容
  4. 保留以供将来定义。

根据 RFC 4122,所有 UUID 变体都是 “真实 UUID”,然后所有 GUID 都是真实 UUID。对于字面问题 “GUID 和 UUID 之间是否有任何区别”,对于 RFC 4122 UUID 绝对没有答案: 没有区别 (但以下面的第二部分为准)。

但是,并非所有的 GUID 都是变体 2 UUID(例如,Microsoft COM 的 GUID 就是变体 3 UUID)。如果问题是 “GUID 和变体 2 UUID 之间是否有任何区别”,那么答案将是 “是”- 它们可以不同。有人问这个问题可能不知道变体 ,他们说 “UUID” 一词时可能只想到变体 2 UUID(例如,他们模糊地知道 MAC 地址 + 时间和 UUID 的随机数算法形式,都是变体 2 的两个版本 。在这种情况下,答案是不同的

因此,答案部分取决于被询问者说 “UUID” 一词时的想法。它们是指变体 2 UUID(因为这是他们知道的唯一变体)还是所有 UUID?

第二部分取决于哪个规范用作 UUID 的定义。

如果您认为这令人困惑,请阅读ITU-T X.667 ISO / IEC 9834-8:2004 ,该文档应该与RFC 4122保持一致并在技术上完全兼容。它在条款 11.2 中有一个额外的句子:“所有符合本建议书 | 国际标准的 UUID 都应具有变体比特,字节 7 的第 7 位设置为 1,字节 7 的 6 设置为 0”。这意味着仅变体 2 UUID 符合该标准(这两个比特值表示变体 2)。如果是这样,那么并不是所有的 GUID 都符合 ITU-T / ISO / IEC UUID,因为符合的 ITU-T / ISO / IEC UUID 只能是变量 2 的值。

因此,真正的答案还取决于问题所询问的 UUID 规范。假设我们清楚地谈论所有的 UUID,而不只是变 2 点的 UUID:有 GUID 和 IETF 的 UUID 的没有什么区别 ,但肯定的 GUID, 符合 ITU-T / ISO / IEC 的 UUID 的区别

二进制编码可能不同

当以二进制编码(与人类可读文本格式相反)时,GUID 可以存储在具有四个不同字段的结构中,如下所示。此格式仅在前 3 个字段的字节顺序上与UUID 标准不同。

Bits  Bytes Name   Endianness  Endianness
                   (GUID)      RFC 4122

32    4     Data1  Native      Big
16    2     Data2  Native      Big
16    2     Data3  Native      Big
64    8     Data4  Big         Big

GUID 是 Microsoft 对 UUID 标准的实现。

根据维基百科

GUID 术语通常是指 Microsoft 对通用唯一标识符 (UUID)标准的实现。

来自同一维基百科文章的最新报价:

RFC 4122 本身声明 UUID“也称为 GUID”。所有这些表明,“GUID” 最初指的是 Microsoft 使用的 UUID 的一种变体,但已成为 UUID 的简单替代名称……

并不是的。 GUID 更加以 Microsoft 为中心,而 UUID 被更广泛地使用(例如,如urn:uuid: URN 方案和 CORBA)。

GUID 在与 UUID 相同的方式不一定是 128 位值的区域中具有悠久的用途。例如, RSS 规范将 GUID 定义为您选择的任何字符串,只要它是唯一的即可,并带有 “isPermalink” 属性,以指定您所使用的值只是返回给要联合的项目的永久链接。

Microsoft 的GUID的文本表示形式可以是 UUID,并用两个大括号{}包围。

SQL Server 中的 GUID 与 PostgreSQL 中的 UUID 之间的区别是字母大小写。 SQL Server 输出较高,而 PostgreSQL 输出较低。

十六进制值 “a” 至 “f” 作为小写字符输出,并且在输入时不区分大小写。 -rfc4122#section-3