Где используются UUID
UUID (universally unique identifier, в Windows его называют GUID) — это 128-битное значение, которое записывается как 32 шестнадцатеричные цифры в пяти группах: 8-4-4-4-12, например 3f1c2b7e-9a4d-4c1e-8b2f-6d0e5a7c9b13. Смысл в том, что любая система может создать его самостоятельно, не обращаясь к центральному счётчику, и при этом быть уверенной, что он никогда не совпадёт с идентификатором, созданным где-то ещё.
Это свойство полезно во многих местах:
- Первичные ключи в базах данных, особенно когда записи создаются на нескольких серверах или офлайн на клиентских устройствах и синхронизируются позже.
- Идентификаторы запросов и корреляции, которые сопровождают одну операцию через логи множества сервисов.
- Имена загружаемых файлов, чтобы два пользователя, загружающие
photo.jpg, никогда не перезаписали друг друга. - Ключи идемпотентности для API платежей и заказов.
- Тестовые фикстуры и начальные данные, которым нужны реалистичные идентификаторы.
Версия 4 и версия 7
Инструмент предлагает две версии, которые важны для новых проектов сегодня. У обеих одинаковые формат и длина; разница — в том, что содержат биты.
UUID v4 (случайный)
Кроме 6 фиксированных бит, обозначающих версию и вариант, все 122 бита случайны. v4 можно узнать по 4 в начале третьей группы. Они берутся из браузерного crypto.randomUUID(), который опирается на криптографически стойкий источник случайности операционной системы.
Используйте v4, когда идентификатор не должен ничего выдавать: токены приглашений в URL, публичные идентификаторы ресурсов, всё, где знание одного ID не должно помогать угадать другой или узнать, когда он был создан.
UUID v7 (упорядочен по времени)
v7, стандартизированный в RFC 9562 в 2024 году, ставит в начало 48-битную метку Unix-времени в миллисекундах, а оставшиеся 74 бита заполняет случайными данными. Третья группа начинается с 7. Поскольку метка времени идёт первой, значения v7 сортируются в порядке создания как обычные строки или байты.
Для баз данных это важно. Индексы B-tree хранят ключи по порядку, а случайные ключи v4 попадают на случайные страницы, вызывая расщепление страниц и плохое использование кэша, когда таблицы дорастают до миллионов строк. Упорядоченные по времени ключи добавляются ближе к концу индекса — почти как автоинкрементное целое, — сохраняя при этом свойство «генерируй где угодно». Для новых таблиц в PostgreSQL, MySQL или SQL Server v7 обычно лучший первичный ключ.
Две оговорки: метка времени читается, поэтому v7 раскрывает момент создания записи с точностью до миллисекунды. И этот генератор не добавляет счётчик внутри миллисекунды, так что идентификаторы, созданные в одну миллисекунду, как бывает внутри одной пачки, упорядочены между собой по случайной части, а не по порядку генерации.
Насколько маловероятен дубликат
Со 122 случайными битами существует около 5,3 × 10^36 возможных значений v4. По парадоксу дней рождения, чтобы шанс хотя бы одного совпадения достиг 50%, их нужно сгенерировать около 2,7 × 10^18. При миллиарде в секунду на это уйдёт больше 80 лет.
У v7 случайная часть — 74 бита, но уникальной она должна быть только среди идентификаторов, созданных в ту же миллисекунду. Даже при миллионе ID за миллисекунду шанс совпадения остаётся ничтожным.
На практике дубликаты возникают из-за ошибок, а не математики: пример ID, захардкоженный и скопированный в продакшен, генератор с фиксированным seed или некриптографический генератор, клонированная виртуальная машина, повторяющая состояние. Генерация в браузере на защищённой системной случайности исключает два последних варианта.
Детали формата и хранение
- Регистр. RFC 9562 предписывает записывать UUID строчными буквами и сравнивать без учёта регистра. Опция Верхний регистр нужна для систем и документации, использующих стиль GUID из Windows.
- Фигурные скобки и дефисы. Некоторые инструменты Microsoft показывают GUID в
{фигурных скобках}. Убирайте их или дефисы, только если целевая система ожидает такую форму. - Хранение. Храните UUID в нативном типе (
uuidв PostgreSQL,BINARY(16)в MySQL), а не вCHAR(36). Двоичная форма занимает 16 байт вместо 36 и сравнивается быстрее. - Размер пачки. До 500 штук за раз, по одному на строку, — готово для вставки в SQL-скрипт или таблицу. Кнопка Сгенерировать заменяет весь список.
UUID — это идентификаторы, а не секреты. v4 трудно угадать, но если он даёт доступ к чему-то, считайте это удобной ссылкой, а не аутентификацией. Для учётных данных используйте «Генератор паролей». Чтобы узнать время создания v7, возьмите первые 12 шестнадцатеричных цифр, переведите их в десятичное число и вставьте в «Конвертер Unix timestamp».