Я вижу эти 2 сокращенные аббревиатуры, и мне было интересно, существуют ли различия между GUID и UUID?
Есть ли разница между GUID и UUID?
Ответ 1
простой ответ: без разницы, это одно и то же. Рассматривайте их как значение в 16 байт (128 бит), которое используется как уникальное значение. В Microsoft говорят, что они называются GUID, но называть их UUID, когда вы не используете Microsoft-talk.
Даже авторы спецификации UUID и Microsoft утверждают, что они являются синонимами:
-
От введения к IETF RFC 4122 "Универсальное уникальное идентификационное имя (UUID) URN Namespace":" Единое пространство имен имен унифицированных ресурсов для UUID (универсально уникальный идентификатор), также известный как GUID (глобально уникальный идентификатор).
-
Из Рекомендация ITU-T X.667, ISO/IEC 9834-8: 2004 Международный стандарт:" UUID также известных как глобально уникальные идентификаторы (GUID), но этот термин не используется в настоящей Рекомендации.
-
И Microsoft даже утверждает, GUID указывается в UUID RFC: "В Microsoft Windows и в операционных системах Windows глобальный уникальный идентификатор (GUID), как указано в [RFC4122],... Термин универсально уникальный идентификатор (UUID) иногда используется в спецификациях протокола Windows как синоним GUID."
Но правильный ответ зависит от того, что означает этот вопрос, когда он говорит "UUID"...
Первая часть зависит от того, что думает ассер, когда говорят "UUID".
Утверждение корпорации Microsoft подразумевает, что все UUID являются идентификаторами GUID. Но являются ли все GUID реальными UUID? То есть, набор всех UUID - это просто соответствующее подмножество набора всех GUID, или это то же самое множество?
Глядя на детали RFC 4122, существует четыре разных "варианта" UUID. Это происходит главным образом из-за того, что такие 16-байтовые идентификаторы использовались до того, как эти спецификации были объединены при создании спецификации UUID. Из раздела 4.1.1 RFC 4122 четыре варианта UUID:
- Зарезервированная, обратная совместимость системы сетевых вычислений
- Вариант, указанный в RFC 4122 (из которых пять подвариантов, которые называются "версиями" )
- Зарезервированная, обратная совместимость Microsoft Corporation
- Зарезервировано для будущего определения.
Согласно RFC 4122, все варианты UUID являются "реальными UUID", тогда все GUID являются реальными UUID. В буквальном вопросе "есть ли разница между GUID и UUID" ответ определенно нет для RFID 4122 UUID: без разницы (но подчиняется второй части ниже).
Но не все GUID являются вариантами UUID 2 (например, Microsoft COM имеет идентификаторы GUID, которые являются вариантами 3 UUID). Если бы вопрос был "есть ли разница между GUID и вариантами UUID варианта 2", тогда ответ был бы да - они могут быть разными. Кто-то, задающий вопрос, вероятно, не знает о вариантах, и они могут думать только о вариантах UUID варианта 2, когда говорят слово "UUID" (например, они смутно знают о MAC-адресе + времени и формах алгоритмов случайных чисел UUID, которые оба варианта варианта 2). В этом случае ответ да другой.
Таким образом, ответ, отчасти, зависит от того, о чем думает человек, когда говорят слово "UUID". Они означают UUID варианта 2 (потому что это единственный вариант, о котором они знают) или все UUID?
Вторая часть зависит от того, какая спецификация используется как определение UUID.
Если вы считаете, что это путано, прочитайте ITU-T X.667 ISO/IEC 9834-8: 2004, который должен быть согласован и полностью технически совместим с RFC 4122. В разделе 11.2 содержится дополнительное предложение, в котором говорится: "Все стандарты UUID, соответствующие этой Рекомендации, должны иметь биты варианта с битом 7 октета 7, установленным в 1 и бит 6 октета 7, установленным в 0". Это означает, что только UUID варианта 2 соответствует этому стандарту (эти два битовых значения означают вариант 2). Если это так, то не все GUID соответствуют ITU-T/ISO/IEC UUID, потому что соответствующие UUID ITU-T/ISO/IEC могут быть только вариантами 2.
Следовательно, реальный ответ также зависит от того, какую спецификацию UUID задает вопрос. Предполагая, что мы четко говорим обо всех UUID, а не только о вариантах UUID: между идентификаторами GUID и IETF UIVID существует без разницы, но да разница между GUID и соответствующими ITU-T/ISO/IEC UUIDs!
Двоичные кодировки могут отличаться
При кодировании в двоичном формате (в отличие от текстового формата, пригодного для человека) GUID может храниться в структуре с четырьмя различными полями следующим образом. Этот формат отличается от стандартом UUID только в байтовом порядке первых трех полей.
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
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
GUID - это реализация Microsoft стандарта UUID.
Per Wikipedia:
Термин GUID обычно относится к реализации Microsoft стандарта Универсальный уникальный идентификатор (UUID).
Обновленная цитата из той же статьи в Википедии:
RFC 4122 сам заявляет, что UUID "также известны как GUID". Все это говорит о том, что "GUID", первоначально ссылаясь на вариант UUID, используемый Microsoft, стал просто альтернативным именем для UUID...
Ответ 3
Не совсем. GUID больше ориентирован на Microsoft, тогда как UUID используется более широко (например, как в схеме urn: uuid: URN и в CORBA).
Ответ 4
GUID имеет многолетнее использование в тех областях, где это не обязательно 128-битное значение так же, как UUID. Например, спецификация RSS определяет GUID как любую строку по вашему выбору, если она уникальна, с атрибутом isPermalink, чтобы указать, что значение, которое вы используете, является постоянной ссылкой на синдицированный элемент.
Ответ 5
Я написал метод преобразования массива байтов в 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;
}
}
Ответ 6
Моя реализация для преобразования из байта 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;
}
Ответ 7
Текстовое представление GUID
Microsoft может быть в форме UUID, окруженного двумя фигурными скобками {}
.
Ответ 8
Одно различие между GUID в SQL Server и UUID в PostgreSQL заключается в буквенном регистре; SQL Server выводит верхний, а PostgreSQL выводит нижний.
Шестнадцатеричные значения от "a" до "f" выводятся как строчные буквы и нечувствительны к регистру при вводе. - rfc4122 # section-3