RFC 4122
RFC 4122 — это спецификация (Request for Comments), определяющая универсальные уникальные идентификаторы (UUID, Universally Unique Identifier), а также их подмножество — глобально уникальные идентификаторы (GUID, Globally Unique Identifier). RFC 4122 был опубликован в июле 2005 года в статусе «Предложенный стандарт» (Proposed Standard) и является действующим стандартом Интернета (Internet Standard 103). Он описывает структуру, формат представления, алгоритмы генерации и правила использования UUID, которые обеспечивают уникальность идентификаторов без необходимости централизованного управления.
История
Потребность в уникальных идентификаторах, не требующих централизованного реестра, возникла в 1980-х годах в связи с развитием распределённых вычислительных систем. Первым известным аналогом была система Apollo Domain/UUID, разработанная компанией Apollo Computer (позднее поглощена Hewlett-Packard). В 1990-х годах корпорация Microsoft внедрила GUID в свою операционную систему Windows (OLE/COM), что способствовало широкому распространению концепции.
В 1998 году была опубликована спецификация UUID версии 1, основанная на времени и MAC-адресе, в рамках проекта Open Software Foundation (OSF) для распределённой вычислительной среды (DCE). Дальнейшее развитие привело к созданию RFC 4122, который обобщил существующие практики, ввёл новые версии (2, 3, 4, 5) и стандартизировал представление UUID в виде текстовой строки. Авторами документа выступили Пол Дж. Лейч (Paul J. Leach), Майкл Мис (Michael Mealling) и Ричард Сэлз (Richard Salz).
Структура UUID
UUID представляет собой 128-битное (16-байтное) число. В каноническом текстовом представлении он записывается в виде 32 шестнадцатеричных цифр, разделённых четырьмя дефисами на пять групп: 8-4-4-4-12. Например: 550e8400-e29b-41d4-a716-446655440000.
Биты внутри UUID структурированы следующим образом:
- Поле времени (time_low) — 32 бита (4 байта), младшие 32 бита временной метки (для версий 1 и 2).
- Поле времени (time_mid) — 16 бит (2 байта), средние 16 бит временной метки.
- Версия (version) — 4 бита, указывают версию UUID (1, 2, 3, 4 или 5). Располагаются в старших 4 битах поля time_hi_and_version.
- Поле времени (time_hi_and_version) — 12 бит (1,5 байта), старшие 12 бит временной метки (для версий 1 и 2).
- Вариант (variant) — 2-3 бита, указывают на вариант схемы UUID. Большинство современных UUID используют вариант RFC 4122 (битовая последовательность
10xx). - Поле clock_seq_hi_and_reserved — 6 бит (0,75 байта), старшие 6 бит последовательности часов.
- Поле clock_seq_low — 8 бит (1 байт), младшие 8 бит последовательности часов.
- Узел (node) — 48 бит (6 байт), MAC-адрес сетевого интерфейса (для версий 1 и 2) или случайное/хэшированное значение.
Версии UUID
RFC 4122 определяет пять версий UUID, каждая из которых использует свой алгоритм генерации.
UUID версии 1 (на основе времени и MAC-адреса)
Генерируется на основе текущего времени (100-наносекундные интервалы, начиная с 15 октября 1582 года) и MAC-адреса сетевого интерфейса. Обеспечивает высокую степень уникальности, но раскрывает время создания и MAC-адрес узла, что может быть нежелательно с точки зрения безопасности. Для компенсации ухода времени вперёд используется последовательность часов (clock sequence), которая увеличивается при обнаружении одинаковых временных меток.
UUID версии 2 (DCE Security)
Является расширением версии 1, предназначенным для использования в распределённой вычислительной среде DCE. Вместо MAC-адреса в поле узла может использоваться идентификатор локального домена (например, UID или GID в POSIX-системах). На практике применяется редко.
UUID версии 3 (на основе MD5-хэша)
Генерируется путём хэширования пространства имён (namespace) и имени (name) с помощью алгоритма MD5. Для одного и того же пространства имён и имени всегда даёт один и тот же UUID. Используется для создания детерминированных идентификаторов. Пространства имён определяются UUID-константами (например, DNS, URL, OID, X.500).
UUID версии 4 (случайный)
Генерируется с использованием криптостойкого генератора псевдослучайных чисел. 122 бита из 128 являются случайными (6 бит зарезервированы для версии и варианта). Обеспечивает хорошую уникальность и не раскрывает никакой информации о создателе. Является наиболее распространённой версией UUID в современных приложениях.
UUID версии 5 (на основе SHA-1 хэша)
Аналогичен версии 3, но использует алгоритм SHA-1 вместо MD5. Считается более криптостойким. Также детерминирован.
Применение
UUID широко применяются в информационных системах для идентификации объектов, когда требуется уникальность без централизованного управления. Основные области использования:
- Базы данных: UUID используются в качестве первичных ключей, особенно в распределённых базах данных (например, Cassandra, CockroachDB, PostgreSQL с расширением
uuid-ossp). Они позволяют объединять данные из разных источников без конфликтов. - Распределённые системы: В микросервисной архитектуре, системах управления версиями (Git — объекты идентифицируются SHA-1 хэшами, концептуально близкими к UUID), системах очередей сообщений.
- Веб-технологии: Идентификаторы сессий, токены, идентификаторы ресурсов (URL, URI). Например, UUID используются в спецификации URN (Uniform Resource Name) как
urn:uuid:. - Операционные системы: GUID в Windows используются для идентификации COM-объектов, интерфейсов, реестра, установленных приложений. В Linux UUID используются для идентификации файловых систем (например, в
/etc/fstab). - Программное обеспечение: Идентификаторы пакетов, библиотек, версий. Например, в Java UUID представлен классом
java.util.UUID.
Критика и ограничения
Несмотря на широкое распространение, UUID имеют ряд недостатков:
- Размер: 128 бит (16 байт) занимают больше места, чем 32-битные или 64-битные целые числа, что может снижать производительность в базах данных при использовании в качестве первичного ключа (особенно в кластеризованных индексах).
- Случайность: UUID версии 4 не гарантируют монотонного возрастания, что может приводить к фрагментации индексов в B-деревьях.
- Предсказуемость: UUID версии 1 могут быть предсказаны, если известен MAC-адрес и временная метка, что создаёт риски для безопасности.
- Коллизии: Хотя вероятность коллизии UUID версии 4 чрезвычайно мала (около 2^122), теоретически она не равна нулю. Для критически важных систем (например, финансовых) может потребоваться дополнительная проверка уникальности.
Альтернативы
Существуют альтернативные форматы идентификаторов, решающие некоторые недостатки UUID:
- ULID (Universally Unique Lexicographically Sortable Identifier): 128-битный идентификатор, сочетающий временную метку и случайную часть, сортируемый по времени.
- Snowflake ID: 64-битный идентификатор, используемый в Twitter (X), основанный на времени, идентификаторе узла и последовательности.
- NanoID: более короткий (21 символ) и настраиваемый идентификатор, использующий случайные символы из алфавита.
- CUID (Collision-resistant Unique Identifier): идентификатор, устойчивый к коллизиям, с дополнительной проверкой.
Источники
- Leach, P. J., Mealling, M., & Salz, R. (2005). A Universally Unique IDentifier (UUID) URN Namespace. RFC 4122. Internet Engineering Task Force (IETF).
- ITU-T Recommendation X.667 (2004) | ISO/IEC 9834-8:2005. Information technology — Open Systems Interconnection — Procedures for the operation of OSI Registration Authorities: Generation and registration of Universally Unique Identifiers (UUIDs) and their use as ASN.1 Object Identifier components.
- The Open Group. (1997). DCE 1.1: Remote Procedure Call. Document C706.
- Microsoft Corporation. (2001). GUID Structure. Windows Platform SDK Documentation.
- PostgreSQL Global Development Group. (2023). PostgreSQL 16 Documentation: UUID Type.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →