Какой тип выбрать?
| UUID v4 | UUID v7 | ULID | |
|---|---|---|---|
| Содержимое | 122 случайных бита | 48-битная метка времени в мс + 74 случайных бита | 48-битная метка времени в мс + 80 случайных бит |
| Сортируется по времени | Нет | Да | Да |
| Текстовая форма | hex 8-4-4-4-12 | hex 8-4-4-4-12 | 26 символов Crockford Base32 |
| Стандарт | RFC 4122 / 9562 | RFC 9562 (2024) | Спецификация сообщества |
| Удобство для БД | Плох как первичный ключ: случайные вставки фрагментируют B-tree индексы | Хорош: новые строки попадают в конец индекса | Хорош, но требует 128-битный столбец или строку из 26 символов |
Для новой системы разумный выбор по умолчанию — UUID v7: это стандартный UUID, его принимает любая база данных и язык, и он сохраняет индексы компактными. Используйте v4, когда ID не должен раскрывать время создания. ULID — хороший выбор там, где важна его более короткая, удобная для URL текстовая форма и экосистема уже его использует.
Чтение битов
В xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx цифра M — версия (4 или 7), а первые биты N — вариант (8, 9, a или b для стандартных UUID). В v7 первые 12 hex-цифр — Unix-время в миллисекундах; в v1 время разбросано по трём полям, а последние 12 цифр — обычно MAC-адрес машины, которая его создала. Инспектор декодирует всё это.
Коллизии
У UUID v4 2¹²² возможных значений. Чтобы достичь 50% вероятности хотя бы одной коллизии, нужно сгенерировать около 2,7 × 10¹⁸ штук — примерно миллиард в секунду на протяжении 85 лет. На практике риск — плохой источник случайности, а не математика, поэтому эта страница использует crypto.getRandomValues, а не Math.random.
Вопросы
В чём разница между UUID и GUID?
На практике никакой. GUID — название Microsoft для того же 128-битного идентификатора. Инструменты Windows часто записывают их прописными буквами в фигурных скобках, что воспроизводит опция формата здесь.
Эти UUID действительно случайны?
Случайные биты берутся из криптографически стойкого генератора браузера (WebCrypto) — того же источника, что используется для ключей. Они не выводятся из ваших часов или чего-либо предсказуемого, за исключением того, что v7 и ULID намеренно включают текущее время.
Можно ли отследить UUID до меня?
v4 — нет. v7 или ULID раскрывают время создания. v1 может содержать MAC-адрес машины-генератора, поэтому v1 и вышел из употребления.
Стоит ли использовать UUID как первичный ключ в базе данных?
Да, если нужны ID, генерируемые клиентами или между сервисами, но предпочитайте v7, чтобы вставки были последовательными. Храните его в нативном 16-байтном столбце UUID (PostgreSQL uuid, MySQL BINARY(16)), а не в строке из 36 символов.
Что такое nil UUID?
00000000-0000-0000-0000-000000000000, определён как заполнитель, означающий «нет значения». RFC 9562 также определяет max UUID из одних единиц.