belun.app Блог EN

UUID v4: что это такое и когда его использовать

Практическое руководство по UUID v4 — как он работает, когда использовать как первичный ключ и чем отличается от других стратегий уникальных ID.

Developer writing code on a laptop — generating unique identifiers

Уникальные идентификаторы нужны везде: строки в базах данных, API-ресурсы, токены сессий, имена загруженных файлов. UUID v4 — один из самых распространённых форматов. Он случаен, устойчив к коллизиям и стандартизирован. Разберём, что это такое, как работает и когда стоит (и не стоит) его применять.

Что такое UUID?

UUID расшифровывается как Universally Unique Identifier. Это 128-битное значение, записанное в виде 32-символьной шестнадцатеричной строки, разбитой на пять групп:

xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx

Цифра 4 в третьей группе — маркер версии 4 (случайной). Символ y в четвёртой группе принимает одно из значений 8, 9, a или b — это маркер варианта. Всё остальное — случайные данные.

Типичный UUID выглядит так:

f47ac10b-58cc-4372-a567-0e02b2c3d479

Как генерируется UUID v4

UUID v4 строится из 122 бит случайности, оставшиеся 6 бит кодируют версию и вариант. Современные браузеры предоставляют crypto.randomUUID(), который использует криптографически стойкий генератор (CSPRNG) — результат безопасен даже для чувствительных контекстов вроде токенов сессий.

Вероятность коллизии ничтожно мала. Чтобы получить 50-процентный шанс хотя бы одной коллизии, нужно сгенерировать более 2,7 × 10¹⁸ UUID — это примерно 86 миллиардов в секунду на протяжении миллиарда лет.

Когда UUID v4 уместен

Первичные ключи в БД. UUID v4 хорошо подходит для распределённых систем, где несколько сервисов создают идентификаторы независимо. Никакого центрального счётчика, никаких блокировок — каждый узел генерирует и записывает самостоятельно.

Идентификаторы API-ресурсов. Последовательные числовые ID позволяют перебирать ресурсы простым инкрементом: /users/1, /users/2 и так далее. UUID это исключает.

ID корреляции и трассировки. Привязываете UUID к каждому входящему запросу и пишете его во все логи. Когда что-то ломается в трёх сервисах одновременно, находите все записи по этому ID и восстанавливаете цепочку событий.

Имена загруженных файлов. UUID как имя файла исключает коллизии и не раскрывает оригинальное имя в хранилище.

Токены сессий. UUID работает как токен сессии при наличии серверной проверки. Для очень высоких требований к безопасности лучше взять больше бит, но для большинства приложений этого достаточно.

UUID v4 в сравнении с другими подходами

СтратегияСлучайный?Сортируемый?Короткий?
UUID v4ДаНетНет
UUID v1Нет (временной)ДаНет
ULIDДаДаНет
Nano IDДаНетДа
АвтоинкрементНетДаДа

Если нужны упорядоченные по времени ID — удобно для индексов БД и пагинации — смотрите на ULID или UUID v7 со встроенной временной меткой. Для коротких ID в URL обычно берут nanoid. Для одного сервера без требований к распределённости целочисленный автоинкремент по-прежнему вполне разумный выбор.

UUID v4 в базах данных

Несколько вещей, которые стоит знать, прежде чем ставить UUID первичным ключом.

Фрагментация индекса. B-дерево работает лучше всего при последовательных вставках. Случайные UUID разбрасывают записи по всему индексу, что снижает производительность записи при большом объёме данных. gen_random_uuid() в PostgreSQL и UUID_TO_BIN(..., 1) в MySQL 8 частично решают проблему — второй вариант переупорядочивает байты, делая UUID частично последовательным. UUID v7 решает это чище.

Объём хранения. UUID в виде CHAR(36) занимает больше места, чем 4-байтовое целое. Используйте нативный тип UUID в PostgreSQL и MySQL 8 или BINARY(16) в остальных случаях.

Читаемость при отладке. Таблицы с UUID-ключами сложнее проверять вручную: глядя на результат запроса, невозможно понять, что перед тобой. Иногда рядом с UUID стоит держать короткий человекочитаемый slug — лишнее поле, но экономит время при отладке.


Нужен UUID прямо сейчас? Генератор UUID работает полностью в браузере — без регистрации и установки. Укажите количество, при желании включите верхний регистр и скопируйте всё сразу.

Попробуйте инструмент

Генератор UUID →