我看到这两个缩略词被抛出,我想知道GUID和UUID之间是否有任何区别?
简单的答案是:没有区别,它们是一回事。将它们视为16字节(128位)值,用作唯一值。在Microsoft中,它们被称为GUID,但在不使用Microsoft时会称它们为UUID。
甚至UUID规范的作者和微软都声称他们是同义词:
但正确的答案取决于问题的含义,当它说“UUID”时......
第一部分取决于提问者在说“UUID”时的想法。
微软的声明暗示所有UUID都是GUID。但是所有GUID都是真正的UUID吗?也就是说,所有UUID的集合只是所有GUID集的适当子集,还是完全相同的集合?
查看RFC 4122的详细信息,UUID有四种不同的“变体”。这主要是因为在创建UUID规范之前将这些规范集合在一起之前使用了这样的16字节标识符。根据RFC 4122的4.1.1节,UUID的四个变体是:
根据RFC 4122,所有UUID变体都是“真正的UUID”,然后所有GUID都是真正的UUID。对于文字问题“GUID和UUID之间是否有任何区别”,对于RFC 4122 UUID,答案肯定是否定的:没有区别(但受下面第二部分的影响)。
但并非所有GUID都是变体2 UUID(例如,Microsoft COM具有变体3 UUID的GUID)。如果问题是“GUID和变体2 UUID之间有什么区别”,那么答案是肯定的 - 它们可以是不同的。有人问这个问题可能不知道变种,他们可能只考虑变体2 UUID,当他们说“UUID”这个词时(例如他们模糊地知道UUID的MAC地址+时间和随机数算法形式,其中是变体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 may be stored在具有四个不同字段的结构中如下。这种格式与UUID standard的区别仅在于前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
GUID是Microsoft对UUID标准的实现。
对于Wikipedia:
术语GUID通常是指Microsoft对Universally Unique Identifier(UUID)标准的实现。
来自同一维基百科文章的更新引用:
RFC 4122本身声明UUID“也称为GUID”。所有这些都表明,“GUID”虽然最初是指Microsoft使用的UUID变体,但它已成为UUID的另一个名称...
并不是的。 GUID更加以微软为中心,而UUID被更广泛地使用(例如,在urn:uuid:URN方案和CORBA中)。
GUID在与UUID相同的方式中不一定是128位值的区域中长期使用。例如,RSS specification defines GUIDs是您选择的任何字符串,只要它是唯一的,具有“isPermalink”属性,用于指定您正在使用的值只是一个永久链接回到正在联合的项目。
微软的GUID
的文本表示可以是UUID的形式,被两个花括号{}
包围。
SQL Server中的GUID和PostgreSQL中的UUID之间的一个区别是字母大小写;当PostgreSQL输出较低时,SQL Server输出上限。
十六进制值“a”到“f”作为小写字符输出,并且在输入时不区分大小写。 - rfc4122#section-3