Вопрос, стоящий за каждым UUID
UUID имеет 128 бит, обычно генерируемых случайно (версия 4), чтобы любой где угодно мог отчеканить его без координации и ожидать, что он будет уникален. Разумное опасение: если все просто бросают кости, не совпадут ли в конце концов двое? Ответ — в принципе да, а на практике практически никогда, и математика говорит точно почему.
Сколько на самом деле случайных бит
UUID версии 4 не имеет 128 случайных бит. Четыре бита фиксированы, чтобы отметить версию, и ещё два — чтобы отметить вариант, что оставляет 122 случайных бита. Это всё ещё огромное пространство: 2¹²², около 5,3 ундециллиона (5,3 × 10³⁶) возможных значений.
Граница дня рождения в применении
Вероятность коллизии зависит не от заполнения пространства; она зависит от числа пар, которое растёт с квадратом числа генерируемых. Это снова парадокс дней рождения. Для пространства из 2¹²² значений вероятность какой-либо коллизии среди n UUID приблизительно:
p ≈ n² / (2 × 2¹²²)
50% шанс одной коллизии наступает лишь после примерно 2⁶¹ UUID, что около 2,3 квинтиллиона (короткая шкала). Чтобы это нагляднее: генерируя миллиард UUID версии 4 в секунду, вам понадобился бы порядка 85 лет лишь для достижения 50% шанса коллизии. При любом реалистичном объёме приложения вероятность настолько мала, что её затмевает шанс, что сбой оборудования всё равно повредит данные.
Единственная реальная оговорка — качество случайности. Математика держится лишь если генератор — надлежащий криптографически безопасный источник. Слабый или плохо инициализированный источник случайности может давать повторения гораздо раньше, так что практический риск — плохой ГПСЧ, а не устройство UUID.
Когда случайность не нужна
Иногда забота не о коллизии, а о воспроизводимости:
- UUID пространств имён (версии 3 и 5) детерминированы: они хешируют пространство имён плюс имя ( для v3, -1 для v5), так что один и тот же ввод всегда даёт один и тот же UUID. Полезно, когда вам нужен стабильный идентификатор, выведенный из существующих данных, а не новый случайный.
- UUID, упорядоченные по времени (версия 7) сохраняют случайность, но предваряют её меткой времени, так что идентификаторы сортируются по времени создания. Это помогает локальности индекса в базе данных, оставляя риск коллизии пренебрежимым.
Урок
Для уникальных идентификаторов в любом нормальном масштабе UUID версии 4 из хорошего источника случайности не сталкивается, и вам не нужен центральный орган, чтобы это гарантировать. Выбирайте v3/v5, когда нужно, чтобы один и тот же ввод отображался в один и тот же идентификатор, и v7, когда хотите упорядочения по времени.
Инструмент UUID генерирует UUID версии 4 (и других) и разбирает любой UUID, чтобы показать его версию и вариант, всё в вашем браузере, без отправки чего-либо.