Генератор UUID: v4, v7 и v1

Создавайте уникальные идентификаторы UUID — v4, v7 или v1

Сколько

Нужен GUID: подойдёт этот же генератор

UUID и GUID — одно и то же, разное только название, второе прижилось в экосистеме Microsoft. На практике отличается лишь запись. В реестре Windows и в коде на C# идентификатор часто носят в фигурных скобках: {6f9619ff-8b86-d011-b42d-00cf4fc964ff}. Скобки — часть оформления, а не значения, перед сравнением или записью в базу их снимают.

Четыре формата записи и где какой нужен

Один и тот же UUID можно записать по-разному, на значение это не влияет. Но принимающая сторона обычно ждёт конкретный вид:

ФорматПримерКогда нужен
Стандартный9efcd058-79dd-485f-94a0-22cf61231d0fКанонический вид из RFC 9562. Его ждут PostgreSQL, MySQL и большинство API
Без дефисов9efcd05879dd485f94a022cf61231d0f32 символа, компактнее в URL и ключах кэша, дефисы всегда можно вернуть
Верхний регистр9EFCD058-79DD-485F-94A0-22CF61231D0FПривычен в мире Microsoft. Сравнивать UUID нужно без учёта регистра
URNurn:uuid:9efcd058-79dd-485f-94a0-22cf61231d0fФорма с префиксом для XML, RDF и других мест, где нужен полноценный URI

Какую кнопку версии нажать

Короткая шпаргалка по переключателю выше. Почему версии устроены именно так и чем v7 лучше v1, разобрано в статье про версии UUID.

ВерсияИз чего собранКогда брать
v4122 случайных битаЗначение по умолчанию. Берите, если ID не станет первичным ключом большой таблицы
v7Время + случайностьЛучший выбор под первичный ключ, сортируется по времени создания
v1Время + MAC-адресНаследие. Раскрывает устройство-источник, для новых проектов не нужен
nilТолько нулиЗаглушка «идентификатора нет», удобнее NULL, когда колонка обязательная

Как сгенерировать UUID в коде

Онлайн-генератор удобен, когда нужно несколько значений руками: для сида базы, теста или заглушки в конфиге. В самом приложении UUID генерируют средствами языка или СУБД, отдельная библиотека почти нигде уже не нужна:

СредаВызов
PostgreSQL 13+gen_random_uuid()
PostgreSQL (v7)uuidv7(), начиная с версии 18
MySQL 8+UUID()
JavaScript / Node 19+crypto.randomUUID()
Pythonimport uuid; uuid.uuid4()
Gogithub.com/google/uuid → uuid.New()
C# / .NETGuid.NewGuid()
JavaUUID.randomUUID()

Все перечисленные функции дают v4 и берут случайность у криптографического генератора операционной системы. А вот Math.random() для сборки UUID вручную не годится. Он не криптостойкий, значения из него предсказуемы, и «уникальность» такого идентификатора держится только на удаче.

Как понять, что перед вами UUID и какой версии

Строка всегда состоит из 32 шестнадцатеричных символов, разбитых дефисами по схеме 8-4-4-4-12. Версия и вариант зашиты прямо в неё, и прочитать их можно глазами:

9efcd058-79dd-485f-94a0-22cf61231d0f

  • Первый символ третьей группы задаёт версию. Здесь 4, то есть случайный UUID. У v7 на этом месте будет 7.
  • Первый символ четвёртой группы задаёт вариант. Значения 8, 9, a или b означают вариант RFC, тот, что используют все современные библиотеки.

Генератор выше показывает разобранные версию и вариант под полем. По ним удобно проверить чужой идентификатор, не считая символы вручную.

Чего UUID не даёт

Уникальность — единственное, что гарантирует формат. Отсюда ограничения, о которые спотыкаются регулярно.

  • Это не секрет. UUID v4 нельзя угадать, но он попадает в адресную строку, историю браузера, логи и заголовок Referer. Как токен сессии или ссылка на сброс пароля он не годится, для этого нужны значения с ограниченным сроком жизни.
  • v1 и v7 раскрывают время. Из такого идентификатора извлекается момент создания записи с точностью до миллисекунд, а v1 выдаёт ещё и сетевой адрес машины. Там, где порядок и время регистрации не должны быть видны снаружи, берите v4.
  • Он не защищает от дублей. Два вызова генератора для одной и той же сущности дадут две разные строки. Уникальность идентификатора и уникальность данных — разные вещи, и вторую по-прежнему обеспечивает ограничение в базе.
  • Он не бесплатный по месту. UUID занимает 16 байт против 4 у обычного int, и эти байты повторяются в каждом внешнем ключе и в каждом индексе, который на них ссылается. На сотне строк разницы нет, на десятках миллионов она заметна на диске и в памяти под индексы.

Разбор всех версий и пространства значений, из-за которого столкновение практически невозможно, есть в статье Что такое UUID и чем отличаются версии v1, v4, v7.

Похожие инструменты

Другие полезные инструменты из той же категории

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

Этот генератор поддерживает три версии и нулевой UUID. v4 — полностью случайный, самый распространённый вариант по умолчанию. v7 — новее (стандартизирован в 2024 году): начинается с метки времени, поэтому такие ID сортируются по порядку создания — удобно как первичный ключ в базе данных. v1 — тоже метка времени, но плюс MAC-адрес устройства, из-за чего сейчас используется редко (MAC-адрес — это утечка информации об источнике). NIL UUID — специальное значение из одних нулей, «пустой» ID-заглушка.

UUID v4 имеет крайне низкую вероятность коллизий (1 к 5.3×10^36). Хотя математически это не невозможно, коллизии практически невозможны в реальных приложениях.

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

Да, но учитывайте влияние на производительность. UUID больше (36 символов против 4-8 байт) и непоследовательны, что может влиять на производительность индекса. UUID v1 или ULID могут быть лучше для баз данных.

Стандартный формат UUID: 8-4-4-4-12 шестнадцатеричных цифр: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. Некоторые системы используют варианты, такие как удаление дефисов или использование заглавных букв.