ChatGPT解决这个技术问题 Extra ChatGPT

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

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

我可以说“GUID”,但不能说“UUID”。
我将 UUID 发音为“you-wid”
我说“you-you-I-dee”,但我不是母语...
UUID 规范 (RFC-4122) 在摘要中说:该规范为 UUID(通用唯一标识符)定义了统一资源名称命名空间,也称为 GUID(全局唯一标识符)
GUID 在 Globe 中是唯一的,UUID 在 Universe 中是唯一的。做出明智的选择!

y
yozzz

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

2020-08-20 更新:虽然 GUID(由 Microsoft 使用)和 UUID(由 RFC4122 定义)看起来相似并且用于相似的目的,但存在细微但有时很重要的差异。具体来说,some Microsoft GUID docs 允许 GUID 在任何位置包含任何十六进制数字,而 RFC4122 要求 versionvariant 字段具有某些值。此外,[per that same link],GUID 应该全部大写,而 UUID should be“输出为小写字符并且在输入时不区分大小写”。这可能导致代码库 (such as this) 之间不兼容。

(原答案如下)

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

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

从IETF RFC 4122“A Universally Unique IDentifier (UUID) URN Namespace”的介绍:“UUIDs(Universally Unique IDentifier)的Uniform Resource Name namespaces,也称为GUIDs(Globally Unique IDentifier)。”

来自 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 的四个变体是:

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

根据 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”。这意味着只有 variant 2 UUID 符合该标准(这两个位值表示 variant 2)。如果这是真的,那么并非所有 GUID 都符合 ITU-T/ISO/IEC UUID,因为符合 ITU-T/ISO/IEC UUID 只能是 variant 2 值。

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

二进制编码可能不同

当以二进制编码(与人类可读的文本格式相反)时,GUID may be stored 在具有以下四个不同字段的结构中。此格式与 [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

比选择的答案提供更多信息。不过,我认为选择的答案是该问题的绝对简单答案。
答案中嵌入的二进制编码表非常有用。肿瘤坏死因子
“字节顺序”非常重要。如果将 id 存储为字节,则会从 GUID 和 UUID 获得不同的结果。
想象一下,只有 665 票的人被卡住了!我怎么能不赞成这个?
p
polypoyo

GUID 是微软对 UUID 标准的实现。

Wikipedia

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

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

RFC 4122 本身声明 UUID“也称为 GUID”。所有这一切都表明,“GUID”虽然最初是指微软使用的 UUID 的变体,但现在已成为 UUID 的简单替代名称……


(G 代表全球)
请注意,如果您想从 Microsoft 的 GUID 二进制表示形式转换为标准 UUID,则必须翻转前三个(四个)数据字段的字节顺序,详见此处的“二进制编码”部分:en.wikipedia.org/wiki/Globally_unique_identifier
这就是为什么不允许宇航员在国际空间站上安装 Windows 的原因。
@bdukes 似乎维基百科改变了你所说的他们的声明。现在显示为 The term "GUID" typically refers to various implementations of the universally unique identifier (UUID) standard.
除了没有发生的情况外,该标准直到 Microsoft 开始使用 GUID 之后才创建。
M
Mark Cidade

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


以微软为中心的定义和作用是什么?
T
Tony Arcieri

GUID 在不一定是 128 位值的领域中长期使用,其方式与 UUID 相同。例如,RSS specification defines GUIDs 可以是您选择的任何字符串,只要它是唯一的,并带有“isPermalink”属性来指定您使用的值只是返回到正在联合的项目的永久链接。


哈哈。鉴于 RSS 规范的臭名昭著的历史,也许不是最好的例子。当然,这并不是 RSS 规范出现荒谬错误的唯一原因。
C
Community

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

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