Есть ли разница между GUID и UUID?

Я вижу эти 2 аббревиатуры, разбросанные вокруг, и мне было интересно, есть ли какие-либо различия между GUID и UUID?

7 ответов


GUID-это реализация Microsoft стандарта UUID.

Per Википедия:

термин GUID обычно относится к реализации Microsoft Универсальный Уникальный Идентификатор (UUID) стандарт.

обновленный цитата из той же статьи Википедии:

RFC 4122 сам утверждает, что UUID "также известны как GUID". Все это говорит о том, что "GUID", в то время как первоначально для варианта UUID, используемого Microsoft, стало просто альтернативным именем для UUID...


на простой ответ - это: без разницы, Это одно и то же. Рассматривайте их как 16-байтовое (128 бит) значение, которое используется как уникальное значение. В Microsoft-speak они называются GUID, но называют их UUID, когда не используют Microsoft-speak.

даже авторы спецификации UUID и Microsoft утверждают, что они являются синонимами:

  • из введения в IETF RFC 4122 "Универсально Уникальный Пространство имен URN идентификатора (UUID)": "единое пространство имен ресурсов для UUID (универсальный уникальный идентификатор), также известный как GUID (глобальный уникальный идентификатор)."

  • С рекомендация X. 667 ITU-T, международный стандарт ISO/IEC 9834-8:2004: "UUIDs также известны как глобально уникальные идентификаторы (GUID), но этот термин не используется в этой рекомендации."

  • и Microsoft даже претензии a Идентификатор GUID определяется UUID RFC: "в программировании Microsoft Windows и в операционных системах Windows глобальный уникальный идентификатор (GUID), как указано в [RFC4122], является ... Термин универсальный уникальный идентификатор (UUID) иногда используется в спецификациях протокола Windows в качестве синонима GUID."

но правильный ответ зависит от того, что означает вопрос, когда он говорит "UUID"...

первая часть зависит от того, что Аскер думает когда они говорят "UUID".

утверждение Microsoft подразумевает, что все UUID являются GUID. Но все ли GUIDs настоящие UUIDs? То есть, является ли набор всех UUID только правильным подмножеством набора всех GUID, или это тот же самый набор?

глядя на детали RFC 4122, есть четыре разных "варианта" UUID. Это в основном связано с тем, что такие 16-байтовые идентификаторы использовались до того, как эти спецификации были объединены при создании спецификации UUID. От раздела 4.1.1 RFC 4122, четыре вариантов из UUID являются:

  1. зарезервировано, сетевая вычислительная система обратная совместимость
  2. на вариант указано в RFC 4122 (из которых есть пять вариантов, которые называют "версиями")
  3. зарезервировано, корпорация Майкрософт обратная совместимость
  4. зарезервировано для будущего определения.

согласно RFC 4122, все Идентификатор UUID вариантов являются "реальными UUIDs", то все GUIDs являются реальными UUIDs. На буквальный вопрос "есть ли разница между GUID и UUID" ответ Определенно нет для RFC 4122 UUIDs:без разницы (но с учетом второй части ниже).

но не все GUID являются вариант 2 UUID (например, Microsoft COM имеет GUID, которые являются вариантом 3 UUID). Если вопрос был "есть ли разница между GUID и вариантом 2 UUIDs", то ответ да , они могут быть разными. Кто-то задает вопрос, вероятно, не знает о вариантов и они могут думать только о вариант 2 UUID, когда они говорят слово "UUID" (например, они смутно знают о MAC-адресе+времени и формах алгоритмов случайных чисел UUID, которые оба версии of вариант 2). В этом случае, ответ да разные.

Итак, ответ, частично, зависит от того, что человек спрашивает думает, когда они говорят слово "UUID". Имеют ли они в виду вариант 2 UUID (потому что это единственный вариант, о котором они знают) или все UUID?

вторая часть зависит от того, какая спецификация используется в качестве определения UUID.

Если вы думаете, что это было запутанно, прочитайте ITU-T X. 667 ISO / IEC 9834-8: 2004, который должен быть выровнен и полностью технически совместимых с RFC 4122. Он имеет экстра предложение в пункте 11.2, в котором говорится: "все UUID, соответствующие настоящей рекомендации | международному стандарту, должны иметь вариантные биты с разрядом 7 октета 7, равным 1, и разрядом 6 октета 7, равным 0". Что означает только вариант 2 UUID соответствуют этому стандарту (эти два битовых значения означают вариант 2). Если это так, то не все GUID соответствуют UUID ITU-T/ISO/IEC, потому что соответствующие UUID ITU-T/ISO/IEC могут быть только вариант 2 ценности.

поэтому реальный ответ также зависит от того, о какой спецификации UUID задается вопрос. Предполагая, что мы явно говорим обо всех UUIDs, а не только о варианте 2 UUIDs: есть без разницы между GUID и UUIDs IETF, но да разница между GUID и соответствующей UUIDs ITU-T/ISO/IEC!

двоичные кодировки могут отличаться

при кодировании в двоичном формате (в отличие от читаемый человеком текстовый формат), 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 более ориентирован на Microsoft, тогда как UUID используется более широко (например, как в урна: uuid: схема урны и в CORBA).


GUID имеет давнее использование в областях, где это не обязательно 128-битное значение так же, как UUID. Например,спецификация RSS определяет GUID чтобы быть любой строкой по вашему выбору, если она уникальна, с атрибутом "isPermalink", чтобы указать, что значение, которое вы используете, является просто постоянной ссылкой на синдицируемый элемент.


Я написал метод преобразования массива байтов Guid в UUID на Java, надеюсь, это поможет:

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;
    }
}

моя реализация для преобразования из порядка байтов UUID Java в 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;
}

Microsoft guid может быть в виде uuid, окруженного двумя фигурными скобками {}...