Страницы

Поиск по вопросам

суббота, 7 декабря 2019 г.

В чём разница между UUID и GUID?

#терминология #uuid #guid


Я часто встречаю эти две аббревиатуры, и интересно, в чём же их отличия?
    


Ответы

Ответ 1



Если кратко: разницы нет, они обозначают одно и то же. Рассматривайте их как 16-байтное (128-битное) значение, которое призвано быть уникальным. В Microsoft их называют GUID, в то время как все остальные называют UUID. И авторы спецификации UUID, и сам Microsoft в настоящее время считают их синонимами: в RFC 4122 указанно, что UUID «also known as GUIDs (Globally Unique IDentifier)»; в 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»; и даже Microsoft в своей документации указывает: «The term universally unique identifier (UUID) is sometimes used in Windows protocol specifications as a synonym for GUID». Однако по-настоящему правильный ответ зависит от того, что именно в вопросе имеется в виду под термином «UUID». Первая часть зависит от того, о чём спрашивающий думает, когда говорит «UUID». Из документации Microsoft неявно следует, что все UUID являются корректными GUID. Однако при этом остаётся неочевидным: любой ли GUID является корректным UUID? Другими словами, является ли UUID всего лишь подмножеством GUID, или это одно и то же множество? В RFC 4122 мы можем обнаружить четыре разных варианта ("variants") UUID. Так получилось из-за того, что подобные 16-байтные идентификаторы использовались и до того, как появилась спецификация UUID. В спецификации эти варианты постарались объединить. Согласно разделу 4.1.1, варианты таковы: вариант 0 (0xxx) — зарезервирован для совместимости с устаревшим Apollo Network Computing System; вариант 1 (10xx) — основной, который и описан в RFC 4122 (имеет пять подвариантов, называемых «версиями»); вариант 2 (110x) — зарезервирован для обратной совместимости с системами Microsoft; вариант 3 (111x) — зарезервирован на будущее. Согласно RFC 4122 все варианты UUID являются «настоящими UUID», так что все GUID также являются UUID. Если отвечать буквально на вопрос «в чём разница между UUID и GUID», то, согласно RFC, ответ — разницы нет (но с учётом написанного ниже). Но не все GUID являются UUID варианта 1 (например, Microsoft COM имеет GUID, которые являются UUID варианта 2). Если отвечать на вопрос «есть ли разница между GUID и UUID варианта 1», то ответ был бы да — они могут быть разными. Кто-нибудь, задающий вопрос про UUID и GUID, вероятно, не в курсе о существовании вариантов, и они, говоря «UUID», неявно подразумевают только UUID варианта 1 (например, они что-то слышали про UUID с MAC-адресом+временем и про случайные UUID, которые оба являются версиями варианта 1). В этом случае ответ — да, разница есть. Так что ответ зависит от того, что имеет в виду спрашивающий, когда говорит «UUID». Имеет ли он в виду UUID варианта 1 или вообще любые UUID? Вторая часть зависит от того, какая спецификация используется в качестве определения UUID. Заглянем в ITU-T X.667 ISO/IEC 9834-8:2004, который должен быть полностью совместим с RFC 4122. В пункте 11.2 есть дополнительное предложение, в котором говорится (перевод): «Все UUID, соответствующие настоящей Рекомендации | Международному стандарту, должны иметь variant-биты с битом 7 октета 7, установленным в 1, и битом 6 октета 7, установленным в 0». В переводе на человеческий язык это означает, что только UUID варианта 1 (10xx) соответствует этому стандарту. В таком случае не все GUID соответствуют UUID в понимании ITU-T/ISO/IEC. Таким образом, реальный ответ зависит и от того, какую именно спецификацию UUID подразумевает вопрос. Если мы говорим о любых UUID, а не только об UUID варианта 1, получается так: нет разницы между GUID и IETF UUID (RFC 4122), однако есть разница между GUID и ITU-T/ISO/IEC UUID! Кодирование в бинарной форме также может отличаться. При кодировании GUID порядок байтов первых трёх полей может быть изменён. Это отличается от UUID, в котором всегда используется только сетевой порядок байтов (big endian). Если вам нужно кодировать UUID/GUID в бинарную форму, внимательно изучите документацию вашей реализации UUID/GUID по поводу порядка байтов. Биты Байты Название поля Порядок байтов Порядок байтов (GUID) RFC 4122 32 4 Data1 Native Big 16 2 Data2 Native Big 16 2 Data3 Native Big 64 8 Data4 Big Big Слегка вольный перевод ответа Hoylen на enSO с дополнениями от сообщества. Нумерация вариантов UUID в RFC не определена, и в этом ответе варианты пронумерованы в соответствии с числом ненулевых бит в обозначении варианта (как в Википедии).

Комментариев нет:

Отправить комментарий