Кошерна ідентифікація UUID чи GUID

universally unique identifier UUID ( - универсальный уникальный идентификатор) — стандарт идентификации, используемый в создании программного обеспечения, стандартизированный Open Software Foundation (OSF) как часть DCE — среды распределённых вычислений. Основное назначение UUID — это позволить распределённым системам уникально идентифицировать информацию без центра координации. Таким образом, любой может создать UUID и использовать его для идентификации чего-либо с приемлемым уровнем уверенности, что данный идентификатор непреднамеренно никогда не будет использован для чего-то ещё. Поэтому информация, помеченная с помощью UUID, может быть помещена позже в общую базу данных, без необходимости разрешения конфликта имен. Наиболее распространённым использованием данного стандарта является Globally Unique Identifier (GUID) фирмы Microsoft.
//ru.wikipedia.org/wiki/UUID  

Хотя GUID (от Microsoft) и UUID (из RFC 4122) выглядят похоже и служат для похожих целей, существуют тонкие, но иногда важные различия. В частности, в документации Microsoft упоминается, что GUID может содержать любые шестнадцатеричные цифры в любых позициях, в то время как RFC 4122 требует использовать определённые значения version и variant. Там же упоминается, что GUID должен быть полностью в верхнем регистре, в то время как UUID должен «выводиться в нижнем регистре и быть нечувствительным к регистру при вводе». Это может привести к несовместимости между разными библиотеками

В 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 является 128-битным кодом (физической последовательностью 16 байт). В каноническом представлении UUID изображают в виде числа в шестнадцатеричной системе счисления, разделённого дефисами на пять групп символов в формате 8-4-4-4-12. Такое представление занимает 36 символов: xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx.

Специальные UUID

Существует два специальных кода UUID:

  • nil (нулевой) UUID 00000000-0000-0000-0000-000000000000
  • Max UUID FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF

К специальным кодам не применяются правила, описанные ниже.

Версия

Для неспециальных кодов UUID стандартом предусмотрено 5 версий для различных областей применения. Номер версии представляют 4 старших бита M в 7-ом байте. Способ представления номера версии в коде соответствует правилам двоичного кодирования:

  • 1 версия (время и MAC-адрес) включает 48 бит MAC-адреса узла (node),  60 бит метки времени (timestamp) и 13 или 14 бит последовательности (sequence), что позволяет генерировать уникальные UUID для 1.6⋅107 узлов до 1.6⋅1011 UUID в секунду
  • 2 версия (время, MAC-адрес и DCE security version) похожа на версию 1...
  • 3 и 5 версии используют необратимое хеширование идентификатора пространства имён и имени, при этом каждая пара из пространства имён и имени всегда однозначно отображается в UUID, но ни пространство имён, ни имя не могут быть обратно получены из UUID аналитическим способом
    • версия 3 использует алгоритм MD5 для вычисления хэш 128 бит
      • код версии 0011 устанавливается в 4 бита M
      • код варианта устанавливается в старшие биты N
        • 2 бита устанавливаются в 10 для RFC 4122
        • 3 бита устанавливают в 110 для Legacy Microsoft GUID
    • версия 5 использует алгоритм SHA-1 для вычисления хэш 160 бит, который обрезается до 128 бит
      • код версии 0101 устанавливается в 4 бита M
      • код варианта устанавливается в старшие биты N
        • 2 бита устанавливаются в 10 для RFC 4122
        • 3 бита устанавливают в 110 для Legacy Microsoft GUID
    • RFC 4122 рекомендует использовать версию 5 вместо версии 3 и не рекомендует использовать ни одну из этих версий в качестве учетных данных для безопасности
  • 4 версия (случайный) генерируется случайным образом
    • вариант 1 (кодируется двумя битами 10) соответствует коду UUID
    • вариант 2 (кодируется тремя битами 110) зарезервирован для обратной совместимости с Microsoft Corporation COM/DCOM для ранних идентификаторов GUID и в настоящее время не используется ни одной спецификацией

Вариант

Если версия UUID предполагает варианты реализации, то номер использованного варианта представляют в двух или трех старших битах N в 9-ом байте (см. выше в Версия).

Алгоритмы генерации

Генерация случайного UUID версии 4 вариант 1

PHP

Google Sheets

Google Apps Script

В сервисном классе/объекте Utilities реализован метод getUuid(): String , который генерирует и возвращает строковое представление нового UUID:

MySQL


!!! UUID()
Returns a Universal Unique Identifier (UUID) generated according to RFC 4122, “A Universally Unique IDentifier (UUID) URN Namespace” (http://www.ietf.org/rfc/rfc4122.txt).
A UUID is designed as a number that is globally unique in space and time. Two calls to UUID() are expected to generate two different values, even if these calls are performed on two separate devices not connected to each other.
Although UUID() values are intended to be unique, they are not necessarily unguessable or unpredictable. If unpredictability is required, UUID values should be generated some other way.

IS_UUID(string_uuid)
Returns 1 if the argument is a valid string-format UUID, 0 if the argument is not a valid UUID, and NULL if the argument is NULL.

UUID_SHORT()
Returns a “short” universal identifier as a 64-bit unsigned integer. Values returned by UUID_SHORT() differ from the string-format 128-bit identifiers returned by the UUID() function and have different uniqueness properties. The value of UUID_SHORT() is guaranteed to be unique if the following conditions hold:

BIN_TO_UUID(binary_uuid), BIN_TO_UUID(binary_uuid, swap_flag)
BIN_TO_UUID() is the inverse of UUID_TO_BIN(). It converts a binary UUID to a string UUID and returns the result. The binary value should be a UUID as a VARBINARY(16) value. The return value is a string of five hexadecimal numbers separated by dashes. (For details about this format, see the UUID() function description.) If the UUID argument is NULL, the return value is NULL. If any argument is invalid, an error occurs. Доступна в MySQL 8.0

UUID_TO_BIN(string_uuid), UUID_TO_BIN(string_uuid, swap_flag)
Converts a string UUID to a binary UUID and returns the result. (The IS_UUID() function description lists the permitted string UUID formats.) The return binary UUID is a VARBINARY(16) value. If the UUID argument is NULL, the return value is NULL. If any argument is invalid, an error occurs. Доступна в MySQL 8.0

Альтернатива для MySQL 5.7

В MySQL 5.7.x нет BIN_TO_UUID() и UUID_TO_BIN(), поэтому генерацию UUID придется реализовать  врукопашную, например, конкатенацией групп:

MariaDB

Present in MySQL Only, because MariaDB and MySQL have differing implementations:
BIN_TO_UUID()
IS_UUID()
UUID_TO_BIN (MDEV-15854)

VBA

GPT-3 рекомендует:

Источники

В чём разница между UUID и GUID? //ru.stackoverflow.com
10.7 preview feature: UUID Data Type //mariadb.org
Function Differences Between MariaDB 10.6 and MySQL 8.0 //mariadb.com
Storing UUID Values in MySQL Tables //dev.mysql.com

Leave a Reply