GUID和UUID有什么区别吗?

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

300638 次浏览

GUID是Microsoft实现的UUID标准。

维基百科

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

来自同一维基百科文章的更新引用:

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

并非如此。GUID更以Microsoft为中心,而UUID使用更广泛(例如,在urn: uuid:可扩展名 URN方案和CORBA中)。

简单的答案是:**没有区别,它们是一样的。

2020-08-20更新:虽然GUID(由Microsoft使用)和UUID(由RFC4122定义)看起来相似并服务于相似的目的,但存在细微但偶尔重要的差异。具体来说,一些Microsoft GUID文档允许GUID在任何位置包含任何十六进制数字,而RFC4122要求versionvariant字段具有某些值。此外,[每个相同的链接],GUID应该是全大写,而UUID应该是“输出为小写字符,输入时不区分大小写”。这可能导致代码库之间的不兼容(比如这个)。

(原答复如下)


将它们视为用作唯一值的16字节(128位)值。在Microsoft语言中,它们称为GUID,但在不使用Microsoft语言时称为UUID。

甚至UUID规范的作者和微软也声称它们是同义词:

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

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

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

但是正确答案取决于问题说“UUID”时的意思。

第一部分取决于提问者在说“UUID”时在想什么。

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

看看RFC 4122的细节,UUID有四种不同的“变体”。这主要是因为这样的16字节标识符在这些规范被合并到创建UUID规范之前就已经使用了。从rfc4122的第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(比如微软的GUID是变体3的UUID)。如果问题是“GUID和变体2的UUID有什么区别吗”,那么答案是肯定的——它们可以不同。问问题的人可能不知道变体,当他们说“UUID”这个词时,他们可能只是想到了变体 2的UUID(例如他们模糊地知道UUID的MAC地址+时间和随机数算法形式,这都是变体 2中的版本)。在这种情况下,答案是是的,不同

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

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

如果您认为这令人困惑,请阅读ITU-T X.667 ISO/IEC 9834-8:2004,它应该与rfc4122对齐并在技术上完全兼容。它在第11.2条中增加了一句话,内容是“所有符合本建议|国际标准的UUID都应具有变体位,其中八位组7的第7位设置为1,八位组7的第6位设置为0”。这意味着只有变体 2UUID符合该标准(这两个位值意味着变体)。如果这是真的,那么并非所有GUID都符合ITU-T/ISO/IEC UUID,因为符合ITU-T/ISO/IEC UUID的只能是变体值。

因此,真正的答案还取决于问题所问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      Big16    2     Data2  Native      Big16    2     Data3  Native      Big64    8     Data4  Big         Big

GUID在不一定是128位值的领域有长期的用法,就像UUID一样。例如,RSS规范定义了GUID是您选择的任何字符串,只要它是唯一的,带有“isPermalink”属性来指定您正在使用的值只是返回到正在联合的项目的永久链接。

SQLServer中的GUID和PostgreSQL中的UUID之间的一个区别是字母大小写;SQLServer输出上而PostgreSQL输出下。

十六进制值“a”到“f”以小写字符的形式输出,并且在输入时不区分大小写。-RFC4122#节-3