代码之家  ›  专栏  ›  技术社区  ›  Apocalisp

guid和uuid有什么区别吗?

  •  763
  • Apocalisp  · 技术社区  · 16 年前

    我看到了这两个首字母缩略词,我想知道guid和uuid之间是否有什么区别?

    7 回复  |  直到 7 年前
        1
  •  693
  •   jtpereyda    11 年前

    这个 简单答案 是: 无差别 它们是一样的。将它们视为一个16字节(128位)的值,该值用作唯一值。在Microsoft Speak中,它们被称为guid,但在不使用Microsoft Speak时,它们被称为uuid。

    甚至UUID规范和Microsoft的作者都声称它们是同义词:

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

    • ITU-T Recommendation X.667, ISO/IEC 9834-8:2004 International Standard :“UUID也称为全局唯一标识符(guid),但此建议中不使用此术语。”

    • 甚至微软 claims uuid rfc指定了一个guid:“在Microsoft Windows编程和Windows操作系统中,如[rfc4122]中指定的全局唯一标识符(guid)是…在Windows协议规范中,术语“通用唯一标识符(UUID)”有时用作guid的同义词。“

    但是 正确回答 取决于问题的意思,当它说“uuid”…

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

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

    查看RFC4122的细节,UUID有四个不同的“变体”。这主要是因为这样的16字节标识符在创建UUID规范之前就已经被使用了。来自第4.1.1节 RFC 4122 ,四 变体 UUID是:

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

    根据RFC 4122,所有UUID 变体 是“真正的UUID”,那么所有的guid都是真正的UUID。对于字面上的问题“guid和uuid之间是否有任何区别”,对于RFC 4122 uuid,答案肯定是否定的: 无差别 (但以下文第二部分为准)。

    但并非所有的吉他都是 变体 2个uuid(例如,Microsoft COM具有3个uuid变体的guid)。如果问题是“guid和变量2 uuid之间有什么区别”,那么答案是肯定的——它们可以是不同的。问这个问题的人可能不知道 变体 他们可能只是在想 变体 2 uuid当他们说“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的变量位。”这意味着只有 变体 2 UUID符合该标准(这两个位值意味着 变体 2)。如果是这样,那么不是所有的guid都符合itu-t/iso/iec uuids,因为符合itu-t/iso/iec uuids只能是 变体 2个值。

    因此,真正的答案还取决于问题所询问的uuid的规范。假设我们清楚地讨论了所有的UUID,而不仅仅是变体2 UUID:有 无差别 在guid和ietf的uuids之间,但是 是差 在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
    
        2
  •  632
  •   bdukes Jon Skeet    7 年前

    guid是微软对uuid标准的实现。

    Wikipedia :

    guid一词通常指的是微软对 Universally Unique Identifier (UUID)标准。

    来自维基百科文章的最新引用:

    RFC4122本身声明UUID“也被称为guid”。所有这些都表明“guid”最初指的是微软使用的uuid的一个变体,但现在已经变成了uuid__的一个替代名称。

        3
  •  14
  •   Mark Cidade    16 年前

    不是真的。guid更以Microsoft为中心,而uuid的使用更广泛(例如 骨灰盒:UUID: URN方案,并在CORBA)。

        4
  •  7
  •   Tony Arcieri    12 年前

    guid在不一定是128位值的地区有着长期的使用,其使用方式与uuid相同。例如, RSS specification defines GUIDs 要成为您选择的任何字符串,只要它是唯一的,并带有一个“is permalink”属性来指定您使用的值只是指向要联合的项目的永久链接。

        5
  •  3
  •   Jason H    11 年前

    我在Java中编写了一个将GUID字节数组转换成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;
        }
    }
    
        6
  •  2
  •   rink.attendant.6    8 年前

    从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;
    }
    
        7
  •  2
  •   Chris Stryczynski    7 年前

    微软 guid 可以是由两个大括号包围的UUID形式 {}