GUID和UUID之间有什么区别吗?


865

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


183
我可以说“ GUID”,我不能说“ UUID”。
Hardwareguy

48
我将UUID发音为“ you-wid”
Matt Greer 2012年

106
我说“ you-you-i-dee”,但我不是母语使用者……
Wilt 2014年

20
UUID规范(RFC-4122概括地说:该规范为UUID(通用唯一IDentifier)(也称为GUID(全局唯一IDentifier))定义了统一资源名称名称空间
Tom

88
UUID在全球范围内是唯一的(宇宙范围),而GUID在全局范围内是唯一的(全局范围)。两者都不都是唯一的,即它们不是MUID。这意味着原则上您不应该行星际使用GUID。除此之外,它们几乎可以互换。
rsp

Answers:


815

简单的答案是:没有区别,它们是同一个东西。将它们视为一个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 可以存储在具有四个不同字段的结构中,如下所示。此格式与UUID标准的区别仅在于前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

35
比选择的答案提供更多信息。我认为选择的答案是对该问题的绝对最简单的答案。
新亚历山大(Alexandria)

3
答案中嵌入的二进制编码表非常有用。Tnx
卢西亚诺

2
“字节序”非常重要。如果将id存储为字节,则会从GUID和UUID获得不同的结果。
卡拉巴辛

想象一下,众生仅受到665次投票!我怎么不能反对呢?
HaakonLøtveit18年

655

GUID是Microsoft对UUID标准的实现。

根据维基百科

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

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

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


39
(G代表全球)
ted.strauss 2012年

487
就像微软采取的措施一样,它可以在任何地方(宇宙)工作,并使其在很小的子集(地球)中工作:)
Gus

33
请注意,如果要从Microsoft的GUID二进制表示形式转换为标准UUID,则必须翻转前三个(四个)数据字段的字节序,如此处“二进制编码”部分所述:en.wikipedia.org/ wiki / Globally_unique_identifier
表格

87
这就是为什么不允许宇航员在国际空间站上安装Windows。
2015年

10
@bdukes似乎维基百科已更改了您所说的声明。现在显示为The term "GUID" typically refers to various implementations of the universally unique identifier (UUID) standard.
Khadim Ali

13

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


1
以微软为中心的定义和作用是什么?
里希

8

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



-2

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.