Открыть сервисСервис

UUID — универсальный идентификатор

UUID (Universally Unique Identifier, «универсально уникальный идентификатор») — 128-битный идентификатор, используемый в программировании и информационных системах для однозначной идентификации объектов без центрального органа регистрации. Стандарт описан в документе RFC 9562 (ранее — RFC 4122). Главная характеристика UUID — вероятностная уникальность: вероятность совпадения двух случайно сгенерированных идентификаторов пренебрежимо мала, что позволяет использовать их в распределённых системах.

Формат

UUID представляется строкой из 32 шестнадцатеричных цифр, разделённых дефисами на пять групп вида 8-4-4-4-12 (например, 550e8400-e29b-41d4-a716-446655440000). Всего строка занимает 36 символов вместе с дефисами. Внутренне UUID — 128 бит, что даёт примерно 3,4 × 10³⁸ возможных значений.

Версии и варианты

Стандарт определяет несколько версий UUID, различающихся алгоритмом генерации:

ВерсияНазваниеМетод генерации
1Time-basedНа основе временной метки и MAC-адреса узла
2DCE SecurityУстаревшая, малораспространённая
3Name-based (MD5)Хеш MD5 от заданного пространства имён и имени
4RandomСлучайные 122 бита
5Name-based (SHA-1)Хеш SHA-1 от пространства имён и имени
6Reordered timeПеревёрнутая временная метка (RFC 9562)
7Unix epoch timeВременная метка в формате Unix + случайные биты (RFC 9562)
8CustomПользовательский алгоритм (RFC 9562)

Вариант (variant) определяет, к какому пространству относится UUID. Основной вариант — RFC 4122 (впоследствии RFC 9562), обозначаемый двумя старшими битами 10. Другие варианты зарезервированы для Microsoft и будущего использования.

Свойства версии 4

Самой распространённой является версия 4 (UUIDv4), основанная на случайных числах. Из 128 бит 122 генерируются случайно, 4 бита зарезервированы под номер версии, 2 бита — под вариант. Генерация не требует синхронизации часов или центрального координатора, что делает её удобной для распределённых систем. Криптографическая стойкость UUIDv4 зависит от качества генератора случайных чисел: стандартный Math.random() в JavaScript не гарантирует криптостойкости, для криптографических целей используются CSPRNG.

Генерация

В разных языках и средах доступны встроенные средства генерации:

  • Python — модуль uuid (uuid.uuid4()).
  • Java — java.util.UUID.randomUUID().
  • JavaScript (Node.js) — модуль crypto.randomUUID().
  • C# / .NET — Guid.NewGuid().
  • Go — пакет github.com/google/uuid.
  • PostgreSQL — функция gen_random_uuid() (расширение pgcrypto в ранних версиях).
  • MySQL — функция UUID().

В Linux и macOS идентификатор можно получить командой uuidgen.

Применение

UUID применяется в широком спектре задач:

  • Базы данных — в качестве первичного ключа таблицы вместо последовательного счётчика. Это позволяет вставлять записи из нескольких узлов без конфликтов и скрывать объём данных.
  • REST API — как идентификатор ресурса (/users/550e8400-e29b-41d4-a716-446655440000).
  • Файловые системы — имена файлов, каталогов, элементов реестра Windows.
  • Компонентные системы — идентификация компонентов в COM/OLE (там используется собственный формат GUID).
  • Распределённые системы — идентификаторы сообщений, транзакций, событий в Kafka и подобных брокерах.
  • Контейнеры и виртуализация — Docker и Kubernetes используют UUID для идентификации объектов.

Достоинства и недостатки

Преимущества UUID: не требуют центрального координатора, работают в распределённых системах, генерируются локально, не раскрывают информацию о количестве объектов (в отличие от последовательных ID).

Недостатки: 128 бит занимают больше места, чем 32- или 64-битный счётчик; строковое представление неудобно для индексации B-деревом; UUIDv1 может раскрывать MAC-адрес и время создания, что является проблемой приватности; случайные UUID плохо уживаются с кластерными индексами PostgreSQL (рекомендуется использовать UUIDv7 или gen_random_uuid() с индексом BRIN).

История

Идея глобально уникальных идентификаторов восходит к системе Network Computing System (NCS) от Apollo Computer (1980-е), где использовались 60-битные идентификаторы. В 1996 году Пол Лич, Тимоти Моран и Кевин Линдси опубликовали RFC 1922, описывающий UUID. В 2005 году вышел RFC 4122, ставший основным справочным документом. В 2024 году RFC 4122 был заменён стандартом RFC 9562, добавившим версии 6, 7 и 8.

Источники

  • RFC 9562: UUIDs, URNs, and Global Identifiers
  • RFC 4122: A Universally Unique IDentifier (UUID) URN Namespace
  • Документация Python: модуль uuid
  • Документация PostgreSQL: тип данных uuid
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru