GUID和UUID之间是否有区别?
我看到了这两个缩写,我想知道GUID和UUID之间是否有区别?
GUID是Microsoft对UUID标准的实现。
按维基百科 :
术语GUID通常是指Microsoft执行通用唯一标识符 (UUID)标准。
来自同一维基百科文章的更新报价:
RFC 4122本身规定UUID“也被称为GUID”。 所有这一切都表明,“GUID”虽然最初是指微软使用的UUID的变种,但已经成为UUID的替代名称…
简单的答案是: 没有区别 ,它们是一样的。 将它们视为一个16字节(128位)值,用作唯一值。 在微软中,他们被称为GUID,但在不使用微软的时候称他们为UUID。
即使是UUID规范的作者和微软声称他们是同义词:
-
从介绍到IETF RFC 4122 “ 通用唯一标识符(UUID)URN命名空间 ”:“UUID(通用唯一标识符)的统一资源名称命名空间,也称为GUID(全局唯一标识符)”。
-
ISO / IEC 9834-8:2004国际标准的ITU-T X.667build议书 :“UUID也称为全球唯一标识符(GUID),但本build议书中不使用此术语。
-
Microsoft甚至声称 GUID由UUID RFC规定:“在Microsoft Windows编程和Windows操作系统中,[RFC4122]中指定的全局唯一标识符(GUID)是…术语通用唯一标识符(UUID )有时在Windows协议规范中用作GUID的同义词。
但是正确的答案取决于问题的意思是什么时候它说“UUID”…
第一部分取决于提问者在说“UUID”时想的是什么。
微软的说法暗示所有的UUID都是GUID。 但是所有GUID都是真正的UUID? 也就是说,所有UUID的集合只是所有GUID集合的一个适当的子集,或者它是完全相同的集合?
查看RFC 4122的细节,UUID有四种不同的“变体”。 这主要是因为在创buildUUID规范之前将这些规范集合在一起之前,这些16字节标识符才被使用。 从RFC 4122的 4.1.1节来看,UUID的四个变体是:
- 保留,networking计算系统向后兼容
- RFC 4122中规定的变体 (其中有五个子变体,称为“版本”)
- 保留,微软公司向后兼容
- 留作未来定义。
根据RFC 4122,所有的UUID 变体都是“真正的UUID”,那么所有的GUID都是真正的UUID。 对于字面问题“GUID和UUID之间是否有区别”,RFC 4122 UUIDs的答案肯定是否定的: 没有区别 (但受以下第二部分的限制)。
但并非所有GUID都是变体 2 UUID(例如Microsoft COM具有变体3 UUID的GUID)。 如果问题是“GUID和变体2 UUID之间有什么区别”,那么答案是肯定的 – 它们可以是不同的。 有人问这个问题可能不知道变体 ,他们可能只是在他们说单词“UUID”(例如他们隐约知道MAC地址+时间和UUID的随机数algorithmforms)时才考虑变体 2UUID都是版本 2)。 在这种情况下,答案是肯定的 。
所以答案部分取决于当他们说“UUID”这个词的时候,这个人问的是什么。 他们的意思是变种2 UUID(因为这是他们知道的唯一变种)或所有的UUID?
第二部分取决于使用哪个规范作为UUID的定义。
如果您认为这很令人困惑,请阅读ITU-T X.667 ISO / IEC 9834-8:2004 ,该标准应与RFC 4122保持一致并完全符合技术要求。 它在第11.2节有一个额外的句子:“所有符合本build议书|国际标准的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
不是真的。 GUID更以微软为中心,而UUID更广泛地使用(例如urn:uuid: URN和CORBA)。
我写了一个方法来将Guid字节数组转换成Java中的UUID,希望它有助于:
public static UUID fromGuidByteArrayToUUID(byte[] blob) { if(blob != null && blob.length == 16) { ByteBuffer b1_4bytes = ByteBuffer.wrap(subByteArray(blob, 0, 4)); b1_4bytes.order(ByteOrder.LITTLE_ENDIAN); ByteBuffer b2_2bytes = ByteBuffer.wrap(subByteArray(blob, 4, 2)); b2_2bytes.order(ByteOrder.LITTLE_ENDIAN); ByteBuffer b3_2bytes = ByteBuffer.wrap(subByteArray(blob, 6, 2)); b3_2bytes.order(ByteOrder.LITTLE_ENDIAN); ByteBuffer b4_8bytes = ByteBuffer.wrap(subByteArray(blob, 8, 8)); b4_8bytes.order(ByteOrder.BIG_ENDIAN); ByteBuffer bb = ByteBuffer.allocate(16); bb.putInt(b1_4bytes.getInt()); bb.putShort(b2_2bytes.getShort()); bb.putShort(b3_2bytes.getShort()); bb.putLong(b4_8bytes.getLong()); bb.position(0); long firstLong = bb.getLong(); long secondLong = bb.getLong(); UUID uuid = new UUID(firstLong, secondLong); return uuid; }else { return null; } }
GUID在与UUID相同的地方不一定是128位的值。 例如, RSS规范将GUID定义为您select的任何string,只要它是唯一的,并带有“isPermalink”属性即可指定您正在使用的值只是返回到要联合的项目的永久链接。
我的实现从Java的UUID字节顺序转换为GUID的
/** * Fix for endian differences between UUID and GUIDS * * @param uuid * @return */ protected static byte[] UuidToGuidByteArray(UUID uuid) { ByteBuffer bb = ByteBuffer.wrap(new byte[16]); bb.putLong(uuid.getMostSignificantBits()); bb.putLong(uuid.getLeastSignificantBits()); byte[] out = bb.array(); byte swap; //swap first 4 swap = out[0]; out[0] = out[3]; out[3] = swap; swap = out[1]; out[1] = out[2]; out[2] = swap; //swap next 2 swap = out[4]; out[4] = out[5]; out[5] = swap; //swap next 2 swap = out[6]; out[6] = out[7]; out[7] = swap; return out; }