Все статьи

UUID: как генерируют идентификаторы, которые почти никогда не повторяются

Федеральный закон 152-ФЗ «О персональных данных» подталкивает многие российские системы избегать хранения записей под последовательными или напрямую связанными с человеком идентификаторами. На практике это часто означает переход на случайные UUID вместо простого auto-increment ID — так внутренний номер записи в базе не выдаёт ни порядок регистрации, ни количество пользователей в системе.

Версии UUID

  • v1 — на основе текущего времени и MAC-адреса сетевой карты. Гарантирует уникальность, но частично раскрывает, когда и на каком устройстве создан идентификатор.
  • v4 — полностью случайный (кроме нескольких служебных битов, обозначающих версию). Самый распространённый вариант сегодня именно из-за отсутствия побочной информации.
  • v5 — детерминированный, вычисляется как хеш от пространства имён и строки — тот же вход всегда даёт тот же UUID.

Почему вероятность коллизии практически нулевая

В UUID v4 случайными являются 122 бита. Даже если генерировать миллиарды UUID в секунду на протяжении веков, вероятность хотя бы одного совпадения остаётся астрономически малой — это математически обосновано теоремой о днях рождения для пространства такого размера.

Зачем это нужно

  • Генерировать первичные ключи базы данных без центрального счётчика или координации между серверами.
  • Скрывать реальный объём таблицы или порядок регистрации записей — то, что явно выдаёт последовательный ID.
  • Избегать предсказуемых последовательных ID, которые легко перебрать (в отличие от 1, 2, 3...).

UUID v7: компромисс между случайностью и сортировкой

Полностью случайный UUID v4 плохо влияет на производительность индексов базы данных — новые записи вставляются в хаотичные позиции дерева индекса вместо конца. Более новый UUID v7 решает это, встраивая метку времени в первые биты идентификатора: значения остаются практически уникальными, как v4, но естественно сортируются по времени создания, как последовательный счётчик — хотя для полностью анонимных идентификаторов это же свойство считается недостатком, ведь метка времени частично раскрывает момент создания записи.

Попробовать инструмент