Что означают версии
UUID — это 128 бит, из которых четыре зарезервированы под номер схемы.
- v4 — 122 случайных бита. Ни структуры, ни порядка, ни информации.
- v7 — 48 бит миллисекунд Unix, дальше случайные биты. Сортируется по времени создания как обычный текст.
Есть и другие версии (v1 зашивает MAC-адрес, v5 хеширует пространство имён), но эти две закрывают почти любую практическую потребность.
Почему v7 важен для базы данных
Индекс B-tree хранит ключи по порядку. С первичными ключами v4 каждая вставка попадает в случайную точку индекса — постоянные расщепления страниц и рабочий набор, разрастающийся до размера всей таблицы. С v7 вставки идут в конец, как у автоинкрементного целого, — но без обращения к базе за следующим значением.
В этом и есть настоящее преимущество перед целочисленным ключом: приложение, воркер очереди или офлайн-клиент могут выдать идентификатор, ни у кого не спрашивая.
Формат записи
Каноническая форма — 36 символов в нижнем регистре с дефисами. Фигурные скобки и верхний регистр — соглашения Microsoft, они до сих пор встречаются в коде .NET и COM, поэтому оба варианта здесь есть. Но если выбор за вами, оставайтесь в канонической форме.
Вопросы
v4 или v7?+
v7, если идентификатор станет первичным ключом в базе, v4 — во всех остальных случаях. В v7 старшие биты содержат метку времени в миллисекундах, поэтому значения сортируются по времени и новые строки попадают в конец индекса. v4 равномерно случаен: вставки разбрасываются по всему индексу и фрагментируют его.
Не утекает ли информация из v7?+
Он раскрывает время создания с точностью до миллисекунды. Обычно это безобидно, иногда нет: номер заказа в виде v7 сообщает клиенту, сколько заказов вы приняли в ту же секунду. Там, где время создания чувствительно, берите v4.
Могут ли два значения совпасть?+
В v4 — 122 случайных бита. Чтобы вероятность одного совпадения достигла 50%, нужно генерировать миллиард в секунду примерно 85 лет. Закладываться на этот риск смысла нет.
Случайность настоящая?+
Она берётся из `crypto.getRandomValues` — криптографического генератора браузера, а не из `Math.random()`. Значения не покидают устройство, поэтому никто, кроме вас, сгенерированных идентификаторов не видел.