Что такое UUID?
UUID (Universally Unique Identifier, универсальный уникальный идентификатор) — 128-битный идентификатор, разработанный для уникальности в пространстве и времени без централизованной координации. Результат — строка из 36 символов в формате:
550e8400-e29b-41d4-a716-446655440000
Кодирует 32 шестнадцатеричные цифры в пяти группах, разделённых дефисами: 8-4-4-4-12.
Версии UUID
UUID v1 — Основан на времени + MAC-адрес
Комбинирует текущую метку времени с MAC-адресом сетевого интерфейса. Хронологически упорядочен, но раскрывает MAC-адрес хоста и точное время создания — проблема конфиденциальности.
UUID v4 — Случайный (самый распространённый)
Заполняет 122 бита криптографически безопасными случайными данными. Не требует состояния, сети или координации. Выбор по умолчанию для большинства случаев.
UUID v5 — Namespace + SHA-1
Детерминированный: тот же namespace + имя = тот же UUID каждый раз. Предпочтите v5 вместо v3 (MD5 устарел).
UUID v7 — Упорядоченный по времени (новый стандарт)
Использует Unix-метку времени в миллисекундах в старших битах. UUID естественно сортируются и значительно улучшают производительность B-дерева в базах данных.
Зачем использовать UUID?
- Нет централизованной координации: Любой клиент или микросервис может независимо генерировать UUID.
- Безопасность через непрозрачность: Последовательные целочисленные ID раскрывают объём данных. UUID ничего не раскрывают.
- Слияние баз данных: Таблицы с UUID-ключами объединяются без конфликтов.
- Генерация оффлайн: Мобильные приложения могут создавать записи оффлайн и синхронизироваться позже.
- Промышленный стандарт: Встроенная поддержка во всех крупных базах данных и фреймворках.
Когда НЕ использовать UUID?
- Накладные расходы хранилища: Используйте
BINARY(16)в MySQL или нативный типuuidв PostgreSQL вместоVARCHAR(36). - Слаги URL: Слишком длинные и незапоминающиеся. Для пользовательских URL используйте читаемые слаги.
- Фрагментация индексов с v4: Для таблиц с высокой записью используйте UUID v7 или ULID.
VARCHAR(36) в высоконагруженных таблицах. Используйте BINARY(16) с UUID_TO_BIN(uuid, 1).
Генерация UUID в коде
JavaScript
const id = crypto.randomUUID(); // v4
Python
import uuid; id = str(uuid.uuid4())
PHP
use Ramsey\Uuid\Uuid;
$v4 = Uuid::uuid4()->toString();
$v7 = Uuid::uuid7()->toString();
SQL
-- MySQL: SELECT UUID();
-- PostgreSQL: SELECT gen_random_uuid();
Лучшие практики
- Хранить как binary:
BINARY(16)или нативный типuuidPostgreSQL. - Использовать v4 в большинстве случаев.
- Использовать v7 для первичных ключей баз данных.
- Избегать v1 в контекстах, чувствительных к конфиденциальности.
- Валидировать формат UUID на входе.
- Всегда использовать нижний регистр.
Часто задаваемые вопросы
Могут ли два UUID быть одинаковыми?
Теоретически да. Вероятность коллизии v4 — около 1 на 5,3×1036. На практике вы никогда не встретите коллизию ни в одной реальной системе.
v4 или v7 для первичных ключей?
v7 для первичных ключей баз данных. v4 вставляет в случайные позиции B-дерева индекса, деградируя производительность. Временной префикс v7 гарантирует вставки в конец индекса.
UUID чувствительны к регистру?
Нет. Спецификация не чувствительна к регистру. По соглашению всегда используйте нижний регистр.