GUID和UUID有什么区别吗?

1141

我看到这两个缩写词被频繁地使用,我想知道GUID和UUID之间是否有任何差异?


273
我可以说“GUID”,但不能说“UUID”。 - Hardwareguy
64
我会将UUID发音为“you-wid”。 - Matt Greer
177
我说“you-you-I-dee”,但我不是母语使用者… - Wilt
36
UUID规范(RFC-4122)在摘要中指出:该规范定义了UUID(通用唯一标识符,也称全局唯一标识符)的统一资源名称命名空间。 - Tom
53
GUID(全局唯一标识符)在全球范围内是唯一的,而UUID(通用唯一标识符)在宇宙范围内是唯一的。选择时要明智! - Nilesh
显示剩余6条评论
5个回答

1090
简短回答:没有区别,它们是同一件事情。
2020-08-20更新:尽管Microsoft使用的GUID和RFC4122定义的UUID看起来相似且具有类似的用途,但存在微妙但偶尔重要的差异。特别是,一些Microsoft GUID文档允许GUID在任何位置包含任何十六进制数字,而RFC4122则要求版本变体字段具有特定值。此外,根据同一链接,GUID应全部大写,而UUID应“以小写字符输出,并在输入时不区分大小写”。这可能会导致代码库之间的不兼容性(例如这种情况)。
(以下为原始答案)
将它们视为一个16字节(128位)的值,用作唯一值。在 Microsoft 术语中,它们被称为 GUID,但在非 Microsoft 术语中,请称其为 UUID。
即使是 UUID 规范的作者和 Microsoft 也声称它们是同义词:
  • 从IETF RFC 4122的介绍中可以看出:"UUID(通用唯一标识符)是一个为UUIDs(通用唯一标识符),也称为GUIDs(全局唯一标识符)定义的统一资源名称命名空间。"

  • 根据ITU-T Recommendation X.667,ISO/IEC 9834-8:2004国际标准所述:“UUID也被称为全局唯一标识符(GUID),但本建议不使用此术语。”

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

但是“正确答案”取决于问题在说“UUID”时的意思……
第一部分取决于提问者在说“UUID”时的想法。
微软的声明意味着所有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变体都是"真实的UUIDs",那么所有GUID都是真实的UUIDs。对于文字问题"GUID和UUID之间有什么区别吗",对于RFC 4122 UUIDs来说答案绝对是否定的:没有差异(但受下面第二部分的影响)。但并非所有GUID都是变体 2 UUID(例如Microsoft COM具有变体3 UUID的GUID)。如果问题是"GUID和变体2 UUID之间有什么区别吗",那么答案就是可以——它们可能不同。提问的人可能不知道变体,他们可能只考虑到说"UUID"这个词时变体 2 UUID(例如,他们隐约知道UUID的MAC地址+时间和随机数算法形式,这两种形式都是变体 2 的版本)。在这种情况下,答案是不同的。因此,答案在某种程度上取决于提问者在说"UUID"这个词时想到了什么。他们是指变体2 UUID(因为这是他们唯一知道的变体),还是所有UUIDs?
第二部分取决于使用哪个规范作为UUID的定义。
如果你认为这很令人困惑,请阅读ITU-T X.667 ISO/IEC 9834-8:2004,它应该与RFC 4122完全技术兼容。在第11.2条款中有一个额外的句子,它说:“符合本建议书|国际标准的所有UUID都应具有位7的变体位设置为1和位6的变体位设置为0”。这意味着只有变体 2 UUID符合该标准(这两个位值表示变体 2)。如果这是真的,那么并不是所有的GUID都符合ITU-T / ISO / IEC UUIDs,因为符合ITU-T / ISO / IEC UUIDs的只能是变体 2值。
因此,真正的答案也取决于问题所问的UUID规范。假设我们明确讨论的是所有UUID而不仅仅是变体2 UUID:GUID和IETF的UUID之间没有区别,但GUID和符合ITU-T/ISO/IEC的UUID之间有差异

二进制编码可能不同

当以二进制形式编码(而不是人类可读的文本格式)时,GUID 可以 存储在具有四个不同字段的结构中,如下所示。这种格式与[UUID标准] 8仅在前3个字段的字节顺序上有所不同。
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

49
比所选答案更丰富详尽。我认为所选答案是回答这个问题的绝对最简单的答案。 - New Alexandria
3
嵌入在答案中的二进制编码表非常有用。谢谢。 - Luciano
2
“字节序”非常重要。如果您将ID存储为字节,则GUID和UUID将产生不同的结果。 - Calabacin
2
想象一下,这些生物只获得了665个赞!我怎么能不点赞呢? - Haakon Løtveit
2
非常好的写作,我本来想点赞的,但它目前恰好是1024。 - SleepyCal
有史以来最好的答案。 - undefined

725

GUID是Microsoft对UUID标准的实现。

根据维基百科

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

同一维基百科文章更新后的引文:

RFC 4122本身说明UUID也被称为GUID。所有这些都表明,“GUID”原来是指由Microsoft使用的UUID变体,已经成为UUID的另一种名称...


47
(G代表全球) - ted.strauss
38
请注意,如果您想将Microsoft的GUID二进制表示转换为标准UUID,则必须翻转前三个(四个中的三个)数据字段的字节序,如此处“二进制编码”部分所述:http://en.wikipedia.org/wiki/Globally_unique_identifier。 - Form
122
这就是为什么宇航员不被允许在国际空间站上安装Windows系统。 - intuited
12
似乎维基百科已经更改了你所提到的声明。现在它的内容是:“术语GUID通常指普遍唯一标识符(UUID)标准的各种实现。” - Khadim Ali
15
但事实并非如此,直到微软开始使用GUID之后,这个标准才被创建出来。 - andynormancx
显示剩余2条评论

19

不完全是。GUID 更多地与 Microsoft 相关,而 UUID 则被广泛使用(例如在 urn:uuid: URN 方案和 CORBA 中)。


10
微软中心化的定义和影响是什么? - Kalle Richter

9

GUID在不一定像UUID一样是128位值的领域中具有悠久的使用历史。例如,RSS规范定义GUID为您选择的任何字符串,只要它是唯一的,并带有“isPermalink”属性来指定您使用的值仅是指向被聚合的项目的永久链接。


可能不是最好的例子,考虑到 RSS 规范的臭名昭著历史。而且 RSS 规范肯定不是唯一荒谬错误的事情。 - Robin Davies

2
SQL Server中的GUID和PostgreSQL中的UUID之间的一个区别是字母大小写;SQL Server输出大写,而PostgreSQL输出小写。
十六进制值“a”到“f”以小写字符输出,并且在输入时不区分大小写。- rfc4122#section-3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接