首页 文章

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

提问于
浏览
743

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

7 回答

  • 14

    GUID是Microsoft对UUID标准的实现 .

    Wikipedia

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

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

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

  • 2

    simple answer 是: no difference ,它们是一回事 . 将它们视为16字节(128位)值,用作唯一值 . 在Microsoft中,它们被称为GUID,但在不使用Microsoft时称其为UUID .

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

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

    • 来自ITU-T Recommendation X.667, ISO/IEC 9834-8:2004 International Standard:"UUIDs are also known as Globally Unique Identifiers (GUIDs), but this term is not used in this Recommendation."

    • 微软甚至claims GUID由UUID RFC指定:"In Microsoft Windows programming and in Windows operating systems, a globally unique identifier (GUID), as specified in [RFC4122], is ... The term universally unique identifier (UUID) is sometimes used in Windows protocol specifications as a synonym for GUID."

    correct answer 取决于问题的含义"UUID" ...

    第一部分取决于提问者在说“UUID”时的想法 .

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

    查看RFC 4122的详细信息,有四种不同的"variants" UUID . 这主要是因为在创建UUID规范之前将这些规范集合在一起之前使用了这样的16字节标识符 . 从RFC 4122的4.1.1节开始,UUID的四个变体是:

    • 保留,网络计算系统向后兼容

    • RFC 4122中指定的变体(其中有五个子变体,称为"versions")

    • 保留,Microsoft Corporation向后兼容

    • 保留供将来定义 .

    根据RFC 4122,所有UUID变体都是"real UUIDs",然后所有GUID都是真正的UUID . 对于字面问题"is there any difference between GUID and UUID",RFC 4122 UUIDs的答案肯定是否定的: no difference (但在下面的第二部分中) .

    但并非所有GUID都是变体2 UUID(例如,Microsoft COM具有变体3 UUID的GUID) . 如果问题是"is there any difference between GUID and variant 2 UUIDs",那么答案是肯定的 - 它们可以是不同的 . 有人问这个问题可能不知道变种,他们可能只考虑变量2 UUID,当他们说单词"UUID"时(例如他们模糊地知道UUID的MAC地址时间和随机数算法形式,这两个版本都是变种2) . 在这种情况下,答案是 yes different .

    所以答案在某种程度上取决于当他们说“UUID”这个词时,他们的想法是什么 . 它们是指变体2 UUID(因为这是他们所知道的唯一变体)还是所有UUID?

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

    如果您认为这令人困惑,请阅读ITU-T X.667 ISO/IEC 9834-8:2004,它应该与RFC 4122完全技术兼容 . 它在第11.2条中有一个额外的句子,即"All UUIDs conforming to this Recommendation | International Standard shall have variant bits with bit 7 of octet 7 set to 1 and bit 6 of octet 7 set to 0" . 这意味着只有变体2 UUID符合该标准(这两个位值表示变体2) . 如果确实如此,那么并非所有GUID都符合ITU-T / ISO / IEC UUID,因为符合ITU-T / ISO / IEC UUID的只能是变量2的值 .

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

    Binary encodings could differ

    当以二进制编码(而不是人类可读的文本格式)时,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
    
  • 3

    并不是的 . GUID更加以微软为中心,而UUID的使用范围更广(例如,在urn:uuid:URN方案和CORBA中) .

  • 628

    GUID在其不一定是与UUID相同的128位值的区域中长期使用 . 例如,RSS specification defines GUIDs是您选择的任何字符串,只要它使用's unique, with an 645146 attribute to specify that the value you'只是一个永久链接回到正在联合的项目 .

  • 2

    我写了一个方法将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;
        }
    }
    
  • 7

    我的实现是从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;
    }
    
  • 672

    微软的 guid 可以是一个uuid的形式被两个花括号 {} 包围...

相关问题