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

UUID

UUID (англ. Universally Unique Identifier — универсальный уникальный идентификатор) — это стандартный 128-битный идентификатор, используемый в информатике для однозначной идентификации объектов, записей или ресурсов в распределённых системах без необходимости централизованного управления. UUID гарантирует уникальность в пространстве и времени, что позволяет независимо генерировать идентификаторы на разных узлах сети без риска коллизий.

История

Разработка стандарта UUID началась в 1980-х годах в рамках проекта Open Software Foundation (OSF) для распределённой вычислительной среды Distributed Computing Environment (DCE). Первоначально спецификация была опубликована в 1997 году как RFC 4122 (IETF), а затем принята в качестве международного стандарта ISO/IEC 11578:1996. В последующие годы стандарт был расширен и уточнён, в частности, в RFC 4122 выделены пять версий UUID, различающихся методом генерации. В 2005 году стандарт был обновлён как ITU-T Rec. X.667. Наибольшее распространение UUID получил в базах данных, файловых системах, протоколах обмена данными и системах управления версиями.

Структура

UUID представляет собой 128-битное число, которое обычно записывается в виде 32 шестнадцатеричных цифр, разделённых дефисами на пять групп в формате 8-4-4-4-12. Пример: 550e8400-e29b-41d4-a716-446655440000.

Биты UUID распределяются следующим образом:

  • Время (версии 1 и 2): 60 бит — временная метка (количество 100-наносекундных интервалов с 15 октября 1582 года), 4 бита — версия, 12 бит — clock sequence, 48 бит — node ID (MAC-адрес сетевого интерфейса).
  • Версия (4 бита): указывает метод генерации (значения от 1 до 5).
  • Вариант (2 бита): определяет формат UUID (стандартный RFC 4122 — значение 10xx).
  • Случайные или хеш-биты (версии 3, 4, 5): остальные биты заполняются случайными числами или результатом хеширования.

Версии UUID

Стандарт RFC 4122 определяет пять версий UUID:

UUID версии 1 (time-based)

Генерируется на основе текущего времени (100-наносекундные интервалы с 15 октября 1582 года), последовательности тактов (clock sequence) и MAC-адреса узла. Обеспечивает временную упорядоченность, но раскрывает MAC-адрес, что может быть нежелательно с точки зрения безопасности. Используется редко в современных системах.

UUID версии 2 (DCE Security)

Аналогичен версии 1, но вместо MAC-адреса использует идентификатор локального пользователя (UID) или группы (GID) по стандарту POSIX. Практически не применяется из-за сложности и ограниченной совместимости.

UUID версии 3 (name-based, MD5)

Генерируется на основе хеша MD5 от имени (например, URL, DNS-имени) и пространства имён (namespace). Обеспечивает детерминированность: одно и то же имя в одном пространстве всегда даёт одинаковый UUID. Используется для идентификации объектов по их имени.

UUID версии 4 (random)

Генерируется полностью случайным образом, за исключением 4 бит версии и 2 бит варианта. Обеспечивает высокую степень уникальности (вероятность коллизии ничтожно мала — около 5,3×10⁻³⁶ для 1 триллиона сгенерированных UUID). Наиболее распространённая версия в современных приложениях.

UUID версии 5 (name-based, SHA-1)

Аналогичен версии 3, но использует хеш SHA-1 вместо MD5. Более криптостойкий, чем версия 3, но требует больше вычислительных ресурсов. Рекомендуется для новых систем.

Форматы представления

Помимо стандартного строкового представления (8-4-4-4-12), UUID может быть записан в других форматах:

  • Сжатый (без дефисов): 550e8400e29b41d4a716446655440000
  • URN: urn:uuid:550e8400-e29b-41d4-a716-446655440000
  • Бинарный: 16 байт (128 бит) в двоичном виде.
  • Base64: кодировка в Base64 (22 символа) или Base64URL (22 символа без символов + и /).

Применение

UUID широко применяется в различных областях информационных технологий:

Базы данных

UUID часто используется в качестве первичного ключа таблиц, особенно в распределённых базах данных (например, Cassandra, MongoDB, CockroachDB) и системах с репликацией, где централизованная генерация автоинкрементных ключей невозможна. Однако UUID занимает больше места (16 байт против 4 байт для 32-битного целого числа) и может снижать производительность индексов из-за случайного порядка вставки.

Файловые системы

UUID применяется для идентификации дисковых разделов (например, в Linux — UUID=... в /etc/fstab), томов и файлов. В файловых системах ext4, XFS, Btrfs UUID используется для монтирования разделов независимо от их имени устройства.

Протоколы и API

UUID используется в протоколах HTTP (например, в заголовках X-Request-Id), в API REST (идентификаторы ресурсов), в системах управления версиями (Git — идентификаторы коммитов, хотя они являются хешами SHA-1, а не UUID), в библиотеках (например, UUID для идентификации сессий).

Идентификация объектов

UUID применяется для уникальной идентификации сущностей в распределённых системах: пользователей, транзакций, документов, сообщений. Например, в платёжных системах, системах электронного документооборота, в IoT (устройства) и в игровых движках (идентификаторы игровых объектов).

Преимущества и недостатки

Преимущества

  • Глобальная уникальность: UUID гарантирует уникальность без централизованного управления.
  • Децентрализация: генерация возможна на любом узле без координации.
  • Стандартизация: RFC 4122 обеспечивает совместимость между системами.
  • Безопасность: версия 4 не раскрывает информацию об узле или времени (в отличие от версии 1).

Недостатки

  • Размер: 128 бит (16 байт) — больше, чем традиционные 32- или 64-битные целые числа.
  • Производительность: случайные UUID (версия 4) вызывают фрагментацию индексов в реляционных базах данных (B-деревья) из-за непоследовательной вставки.
  • Человекочитаемость: UUID трудно запомнить или ввести вручную.
  • Коллизии: хотя вероятность ничтожна, теоретически коллизии возможны (для версии 4 — около 2⁻¹²²).

Интересные факты

  • В 2019 году исследователи из Университета Твенте доказали, что UUID версии 1 можно использовать для отслеживания пользователей, так как MAC-адрес и время генерации могут быть извлечены.
  • Некоторые системы (например, Twitter Snowflake) разработали собственные 64-битные идентификаторы (snowflake ID) для уменьшения размера при сохранении временной упорядоченности.
  • В стандарте ISO/IEC 11578:1996 UUID называется «универсальным уникальным идентификатором» (UUI), но термин UUID закрепился благодаря RFC 4122.
  • В операционной системе Linux UUID используется для идентификации сетевых интерфейсов (например, enp0s3), хотя это не стандартный UUID.

Источники

  • RFC 4122 — A Universally Unique IDentifier (UUID) URN Namespace (2005)
  • ITU-T Rec. X.667 — Information technology — Procedures for the operation of object identifier registration authorities: Generation of universally unique identifiers (2005)
  • ISO/IEC 11578:1996 — Information technology — Open Systems Interconnection — Remote Procedure Call (RPC)
  • Leach, P., Mealling, M., Salz, R. — «UUIDs and GUIDs», Internet Engineering Task Force (2005)
  • Tanenbaum, A. S., Van Steen, M. — «Distributed Systems: Principles and Paradigms» (2007)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →