UUID v4: что это, зачем нужен и как генерировать
Что такое UUID
UUID (Universally Unique Identifier) — это 128-битный идентификатор, который гарантированно уникален в глобальном масштабе без центрального координирующего органа. UUID записывается как 32 шестнадцатеричных символа, разделённых дефисами в формате 8-4-4-4-12:
550e8400-e29b-41d4-a716-446655440000
UUID стандартизирован в RFC 4122 и используется повсеместно: базы данных, API, распределённые системы, сессии, файловые системы. Главное преимущество UUID — возможность генерировать уникальные идентификаторы на любом устройстве без подключения к серверу и без риска коллизий.
Версии UUID
Существует несколько версий UUID, каждая с разным механизмом генерации:
UUID v1 — на основе времени и MAC-адреса
Генерируется из текущей метки времени (100-наносекундные интервалы с 15 октября 1582 года) и MAC-адреса сетевого интерфейса. Гарантирует уникальность, но раскрывает информацию о времени создания и устройстве. По UUID v1 можно узнать, когда и на каком компьютере он был создан — это потенциальная проблема конфиденциальности.
UUID v4 — случайный
Самая популярная версия. 122 бита из 128 генерируются случайным образом (6 бит зарезервированы для обозначения версии и варианта). UUID v4 не содержит никакой информации о времени или устройстве — это чистая случайность. Именно этот вариант используется в большинстве современных приложений.
UUID v7 — на основе Unix timestamp (новый)
Предложен в новой спецификации (RFC 9562, 2024 год). Первые 48 бит — это Unix timestamp в миллисекундах, остальные — случайные. Преимущество: UUID v7 сортируемы по времени, что значительно улучшает производительность при использовании в качестве первичных ключей в базах данных (нет фрагментации индексов B-tree).
Вероятность коллизий UUID v4
UUID v4 имеет 122 бита случайности, что даёт 2^122 (примерно 5.3 × 10^36) возможных значений. Чтобы оценить вероятность коллизии, используют «парадокс дней рождения»:
- При генерации 1 миллиарда UUID v4 вероятность хотя бы одной коллизии — около 0.00000000000000003% (3 × 10^{-17}).
- Чтобы вероятность коллизии достигла 50%, нужно сгенерировать около 2.7 × 10^18 UUID — это 2.7 квинтиллиона идентификаторов.
- Если генерировать 1 миллиард UUID в секунду, потребуется 85 лет, чтобы вероятность коллизии достигла 50%.
На практике коллизии UUID v4 не встречаются. Это математически обоснованная надёжность, а не просто «маловероятно».
Где используются UUID
Базы данных
UUID часто используется как первичный ключ вместо автоинкрементного числа. Преимущества: можно генерировать ID на клиенте до вставки в базу, легко объединять данные из разных баз, нет предсказуемости (пользователь не может перебирать ID). Недостаток UUID v4: случайность ухудшает производительность B-tree индексов. Решение — UUID v7 или ULID, которые сортируемы по времени.
API и распределённые системы
В микросервисной архитектуре каждый сервис может генерировать UUID независимо. Это устраняет необходимость центрального сервиса выдачи идентификаторов и убирает единую точку отказа. UUID используются для идентификации запросов (correlation ID), транзакций, сессий и ресурсов.
Файловые системы и диски
В Linux разделы диска идентифицируются по UUID (команда blkid). Это надёжнее, чем имена устройств (/dev/sda1), которые могут меняться при перезагрузке или подключении новых дисков.
UUID vs альтернативы
- Автоинкремент — простой, компактный, но требует центральной базы данных и предсказуем. UUID лучше для распределённых систем.
- ULID (Universally Unique Lexicographically Sortable Identifier) — сортируемый по времени, компактнее UUID в текстовом представлении. Хорошая альтернатива UUID v4 для баз данных.
- Snowflake ID (Twitter/Discord) — 64-битный ID, сортируемый по времени, с встроенным ID машины. Компактнее UUID, но требует координации ID машин.
- NanoID — компактный случайный ID с настраиваемым алфавитом и длиной. Популярен для URL-friendly идентификаторов.
Как генерировать UUID
В большинстве языков есть встроенные средства:
- JavaScript:
crypto.randomUUID()(в современных браузерах и Node.js 19+). - Python:
import uuid; uuid.uuid4(). - PHP:
Str::uuid()(Laravel) илиramsey/uuid. - PostgreSQL:
gen_random_uuid(). - MySQL:
UUID()(генерирует v1).
Для быстрой генерации UUID без кода используйте наш генератор UUID. Он создаёт криптографически стойкие UUID v4 прямо в вашем браузере.
Часто задаваемые вопросы
Сколько байт занимает UUID?
UUID — это 128 бит, или 16 байт в бинарном представлении. В текстовом формате (с дефисами) — 36 символов. В базах данных рекомендуется хранить UUID как бинарный тип (BINARY(16) в MySQL, UUID в PostgreSQL), а не как строку — это экономит место и ускоряет индексы.
Чем UUID отличается от хеша?
UUID — это случайный (или основанный на времени) идентификатор, не привязанный к данным. Хеш — результат детерминированной функции от входных данных. Одни и те же данные всегда дадут одинаковый хеш, но разные UUID при каждой генерации. UUID используется для идентификации, хеш — для проверки целостности.
Почему UUID v4 плохо работает как первичный ключ?
UUID v4 полностью случаен, что приводит к фрагментации B-tree индексов в базах данных: новые записи вставляются в случайные позиции дерева, а не в конец. Это замедляет вставку и увеличивает потребление дискового ввода-вывода. Решение — использовать UUID v7, ULID или сортируемые варианты UUID, где первые байты содержат метку времени.
Как быстро сгенерировать UUID?
Откройте наш генератор UUID и получите один или несколько UUID v4 одним кликом. Идентификаторы генерируются в вашем браузере с использованием криптографически стойкого генератора случайных чисел.