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