Что такое UUID? Полное руководство по RFC 9562 и современным уникальным идентификаторам

现代 UUID 标识符的视觉概念图

Каждая современная база данных, распределённая система и API используют уникальные идентификаторы — и в 2026 году стандарт, их регулирующий, фундаментально изменился. UUID (универсальный уникальный идентификатор, Universally Unique Identifier) — это 128-битная метка, способная идентифицировать информацию в компьютерных системах без какой-либо центральной координации. В рамках нового RFC 9562 (заменившего RFC 4122 в мае 2024 года) ландшафт сменился: UUID v4 остаётся стандартом для случайных ID, но UUID v7 теперь рекомендован как первичный ключ баз данных, поскольку его упорядоченная по времени структура предотвращает фрагментацию B-дерева.

Это руководство охватывает картину целиком: как работают UUID, какую версию когда применять и как правильно их реализовать.

Понимание RFC 9562: современный стандарт UUID

UUID — это 128-битное число, уникальность которого практически гарантирована — без какого-либо центрального органа. Согласно Википедии, вероятность коллизии двух UUID настолько близка к нулю, что для реальных приложений считается невозможной. Разные команды могут размечать данные независимо, уверенные, что их ID не столкнутся.

В мае 2024 года IETF опубликовал RFC 9562, выведя из оборота старый RFC 4122. Обновление отвечало запросам современных распределённых систем, которым нужны были ID, одновременно уникальные и сортируемые по времени. Были введены три новые версии: v6, v7 и v8.

Анатомия UUID: версии и варианты

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

550e8400-e29b-41d4-a716-446655440000
            ^
          version

Два ключевых поля говорят о том, как был сгенерирован UUID:

Поле Расположение Что сообщает
Биты версии Первые 4 бита 7-го байта (первый символ 3-й группы) Какой алгоритм использован (например, «4» = v4, «7» = v7)
Биты варианта 9-й байт Вариант UUID — RFC 9562 использует битовый шаблон 10

Как поясняет SnapUtils, биты варианта отделяют современные UUID стандарта RFC 9562 от устаревших форматов Apollo или Microsoft.

Схема разбора структуры UUID

Почему UUID v7 — новый золотой стандарт для баз данных

Главный недостаток UUID v4 — он полностью случаен. При использовании в качестве первичного ключа в индексе B-дерева базе данных приходится вставлять новые строки в непредсказуемые позиции. По словам CreateUUID, это вызывает «разделение страниц» (page splits) — базе приходится постоянно реорганизовывать данные, освобождая место, что замедляет запись и расходует память впустую.

UUID v7 решает это, помещая 48-битную временную метку Unix Epoch (с точностью до миллисекунды) в начало ID. Это делает ID монотонно возрастающими — новые всегда больше предыдущих. База может просто дописывать их в конец индекса, обеспечивая производительность последовательного целого при глобальной уникальности UUID.

Сравнение случайной вставки UUID v4 и последовательной вставки UUID v7

Как UUID v7 балансирует время и энтропию

UUID v7 заполняет оставшиеся 74 бита с помощью CSPRNG (криптостойкого генератора псевдослучайных чисел). Согласно Википедии, чтобы достичь 50%-й вероятности коллизии, нужно генерировать около 1 миллиарда UUID в секунду на протяжении 85 лет. Для любого реального приложения UUID v7 фактически защищён от коллизий.

Лучшие практики хранения: Binary(16) против String(36)

То, как вы храните UUID, не менее важно, чем выбор версии:

Формат хранения Место Производительность индекса Рекомендация
Binary(16) 16 байт Высокая (компактно) Лучшая практика
Нативный тип UUID 16 байт Высокая (оптимизировано) Лучше всего для PostgreSQL
Строка (Char 36) 36–72 байта Низкая (фрагментация) Избегать

SnapUtils рекомендует всегда использовать нативные типы вместо строк. В PostgreSQL нативный тип uuid хранит данные в компактном 16-байтовом бинарном формате, поддерживая при этом стандартные строковые запросы.

UUID против GUID: есть ли разница?

GUID (глобальный уникальный идентификатор, Globally Unique Identifier) — реализация стандарта UUID от Microsoft. Исторически была разница в порядке байтов (endianness) — ранние Microsoft GUID использовали обратный порядок байтов (little-endian) для первых трёх полей, тогда как стандартные UUID — прямой (сетевой порядок байтов) (SnapUtils).

К 2026 году это в основном соглашение об именовании. В рамках RFC 9562 они работают идентично. Guid.NewGuid() в .NET полностью совместим с uuid.uuid4() в Python. «GUID» вы услышите в кругах Windows/Azure, а «UUID» — в сообществах Linux и открытого ПО.

Реализация современных UUID: по языкам

Язык UUID v4 UUID v7
Python Встроенный модуль uuid Пакет uuid6 или uuid7
JavaScript crypto.randomUUID() npm-пакет uuid (v10+)
PostgreSQL gen_random_uuid() (PG 13+) Нативный uuidv7() (PG 17+) или расширения
.NET Guid.NewGuid() Пакеты сообщества
Rust крейт uuid (v1.7+) крейт uuid с фичей v7

Детерминированные ID: UUID v5

Если вам нужен один и тот же ID каждый раз для заданного ввода (например, URL или имени пользователя), используйте UUID v5. Он хэширует UUID пространства имён и строку имени по алгоритму SHA-1 — идеально для дедупликации, когда нельзя обратиться к центральной базе.

Урок конфиденциальности из UUID v1

UUID v1 использует временную метку и MAC-адрес компьютера. Он практически заброшен, поскольку раскрывает сведения об оборудовании. Известный пример: создатель вируса Melissa был пойман, поскольку UUID в заражённых документах Word содержали его конкретный MAC-адрес.

Продвинутый RFC 9562: v6, v8 и специальные UUID

RFC 9562 добавил специализированные версии под нишевые нужды распределённых систем:

Версия Назначение Когда применять
v6 Переупорядоченная временная метка v1 — сортируемая с сохранением точности v1 Миграция унаследованных систем v1
v8 Пользовательская — 122 бита для данных, определяемых разработчиком Экспериментальные или специфичные для вендора схемы
Nil UUID 00000000-0000-0000-0000-000000000000 Пустой заполнитель
Max UUID FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF Маркер конца диапазона

Заключение

RFC 9562 обновил уникальные идентификаторы для современной облачной эры. Практические ориентиры:

  • Первичные ключи БД → используйте UUID v7 для упорядоченных по времени вставок без фрагментации
  • Общая случайность → UUID v4 по-прежнему вполне подходит
  • Дедупликация → UUID v5 даёт детерминированные ID
  • Хранение → всегда Binary(16) или нативные типы UUID, никогда строки

Шаг к действию: Проверьте схемы своей базы данных. Если вы используете UUID v4 как первичный ключ в таблицах с миллионами строк, переход на UUID v7 — несложное изменение, способное заметно снизить фрагментацию индекса и ускорить запросы.

Часто задаваемые вопросы

UUID — это то же самое, что GUID?

Функционально да. GUID — реализация стандарта UUID от Microsoft. В рамках RFC 9562 их поведение идентично — их можно взаимозаменяемо использовать в приложениях .NET, Java и Python.

Могут ли два UUID когда-либо столкнуться в реальном сценарии?

Математически возможно, практически невозможно. Для UUID v4 нужно сгенерировать примерно 2,71 квинтиллиона ID, чтобы достичь 50%-й вероятности коллизии. Согласно Generate-Random.org, генерация 1 миллиарда UUID в секунду на протяжении 85 лет даёт лишь 50% шанс одной коллизии.

Хранить UUID в базе как строки или как бинарные данные?

Всегда отдавайте предпочтение Binary(16) или нативному типу UUID (доступен в PostgreSQL). 36-символьная строка расходует более чем в два раза больше места и значительно замедляет поиск по индексу и соединения.SnapUtils отмечает, что преимущества RFC 9562 по производительности максимизируются, когда хранение остаётся компактным.

Когда стоит использовать UUID v5 вместо UUID v4?

Используйте v5, когда нужны детерминированные ID — одинаковый ввод всегда даёт один и тот же UUID без обращения к базе. Используйте v4, когда нужна полная случайность и вы хотите, чтобы идентификатор нельзя было реверс-инжинирить к его источнику.

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *