Руководство по UUID: версии, форматы и лучшие практики
UUID (Universally Unique Identifiers) — это 128-битные идентификаторы, спроектированные для обеспечения уникальности в пространстве и времени без центрального координирующего органа. Они являются стандартным выбором для распределённых систем, где необходимо генерировать идентификаторы независимо — без координации.
Формат UUID
UUID — это 128-битное число, отображаемое в виде 32 шестнадцатеричных цифр, разделённых дефисами на пять групп:
550e8400-e29b-41d4-a716-446655440000
^^^^^^^^ ^^^^ ^^^^ ^^^^ ^^^^^^^^^^^^
time-low mid hi clk node
+ver +var
- Всего: 128 бит (16 байт)
- Длина строки: 36 символов (32 hex-символа + 4 дефиса)
- Версия: закодирована в 13-м символе (старший полубайт «hi»)
- Вариант: закодирован в 17-м символе
Генерируйте UUID мгновенно с помощью нашего генератора UUID.
Версии UUID
UUID v1: на основе времени
Генерируется из текущей метки времени и MAC-адреса машины.
// Структура: timestamp (60 бит) + clock sequence (14 бит) + node (48 бит)
6ba7b810-9dad-11d1-80b4-00c04fd430c8
Плюсы: естественная сортировка по времени создания, гарантия уникальности на каждой машине. Минусы: раскрывает MAC-адрес (проблема конфиденциальности), может раскрыть время создания. Используйте, когда: нужна упорядоченность по времени и вы работаете в контролируемой среде.
UUID v4: случайный
Генерируется из криптографически безопасных случайных чисел. Наиболее широко используемая версия.
// 122 случайных бита (6 бит зарезервированы для версии и варианта)
f47ac10b-58cc-4372-a567-0e02b2c3d479
Плюсы: простота, отсутствие утечки информации, не требуется координация. Минусы: не сортируется, немного уступает по производительности индексов в БД последовательным идентификаторам. Используйте, когда: для общего назначения — это выбор по умолчанию для большинства приложений.
UUID v7: упорядоченный по времени случайный (новый стандарт)
Новейшая версия (RFC 9562, 2024), объединяющая метку времени Unix со случайными данными.
// Структура: timestamp (48 бит) + random (74 бита)
018e7b50-4a00-7000-8000-000000000001
Плюсы: естественная сортировка по времени, отличная производительность индексов в БД, отсутствие утечки информации помимо миллисекундной точности. Минусы: более новый формат, некоторые библиотеки могут его не поддерживать. Используйте, когда: нужны уникальные идентификаторы с хронологической сортировкой — идеально для первичных ключей в базах данных.
Другие версии
- UUID v3: хеш MD5 от пространства имён и имени. Детерминированный.
- UUID v5: хеш SHA-1 от пространства имён и имени. Детерминированный и предпочтительнее v3.
- UUID v6: перегруппированный v1 для лучшей сортировки. Вытеснен версией v7.
- Nil UUID: все нули (
00000000-0000-0000-0000-000000000000). Используется как сигнальное значение.
Вероятность коллизий
Насколько вероятно совпадение двух случайно сгенерированных UUID (v4)? При 122 случайных битах:
- После генерации 1 миллиарда UUID: вероятность ≈ 1 к 10^18
- Для 50%-ной вероятности коллизии: необходимо приблизительно 2,7 × 10^18 UUID
- При скорости 1 миллиард UUID в секунду: потребуется около 86 лет
На практике коллизии UUID v4 не произойдут. Аппаратный сбой гораздо более вероятен.
UUID в сравнении с другими форматами идентификаторов
| Формат | Длина | Сортировка | Уникальность | URL-безопасный |
|---|---|---|---|---|
| UUID v4 | 36 символов | Нет | Да | Да |
| UUID v7 | 36 символов | Да | Да | Да |
| ULID | 26 символов | Да | Да | Да |
| nanoid | 21 символ | Нет | Вероятно | Да |
| Автоинкремент | Переменная | Да | На таблицу | Да |
| Snowflake ID | 18–19 символов | Да | На систему | Да |
ULID (Universally Unique Lexicographically Sortable Identifier)
ULID — это компактная альтернатива: 48-битная метка времени + 80-битное случайное значение, закодированное в 26 символах Crockford Base32. Они сортируются лексикографически по времени создания.
Когда использовать автоинкрементные идентификаторы
Последовательные идентификаторы проще и эффективнее для приложений с одной базой данных. Используйте UUID, когда вам нужно:
- Генерировать идентификаторы несколькими системами независимо
- Идентификаторы, которые не раскрывают порядок вставки внешним пользователям
- Идентификаторы, совместимые со слиянием данных в распределённых базах
Вопросы производительности баз данных
Случайные UUID (v4) вызывают фрагментацию B-tree-индекса, потому что вставки происходят в случайные позиции. Это может снизить производительность записи в 2–5 раз по сравнению с последовательными идентификаторами на больших таблицах.
Решения:
- Используйте UUID v7: упорядоченные по времени UUID вставляются последовательно, обеспечивая производительность на уровне автоинкремента
- Храните в бинарном формате: используйте
BINARY(16)вместоCHAR(36), чтобы сэкономить 55% хранилища - Используйте ULID: сортируемый и более компактный, чем UUID
-- PostgreSQL: нативный тип UUID (16 байт, эффективный)
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name TEXT NOT NULL
);
-- MySQL: хранение в BINARY(16) для производительности
CREATE TABLE users (
id BINARY(16) PRIMARY KEY,
name VARCHAR(255) NOT NULL
);
Генерация UUID
Командная строка
# macOS/Linux
uuidgen
# Python-однострочник
python3 -c "import uuid; print(uuid.uuid4())"
JavaScript
// Встроенный (Node.js 19+, современные браузеры)
crypto.randomUUID();
// Для UUID v7 (с использованием пакета uuid)
import { v7 } from 'uuid';
const id = v7();
Python
import uuid
uuid.uuid4() # Random
uuid.uuid5(uuid.NAMESPACE_DNS, 'example.com') # Name-based
Для быстрой генерации без кода наш генератор UUID мгновенно создаёт UUID v4 прямо в браузере.
Часто задаваемые вопросы
Что выбрать для первичного ключа в базе данных: UUID или автоинкрементное целое число?
Для приложений с одной базой данных автоинкрементные целые числа проще и быстрее. Для распределённых систем, микросервисов или когда нужно генерировать идентификаторы на стороне клиента до вставки в базу, UUID (предпочтительно v7) — лучший выбор. При использовании PostgreSQL нативная поддержка UUID делает разницу в производительности незначительной.
Можно ли использовать UUID как токены безопасности?
UUID v4 использует 122 бита случайности из криптографического источника, что обеспечивает хорошую энтропию. Однако для токенов безопасности (API-ключи, идентификаторы сессий) лучше использовать специализированные форматы токенов с дополнительными свойствами, такими как контрольные суммы, кодирование срока действия или префиксная идентификация. UUID предназначены для идентификации, а не для аутентификации.
Связанные ресурсы
- Генератор UUID — мгновенная онлайн-генерация UUID
- Сравнение алгоритмов хеширования — хеш-функции, используемые в UUID v3 и v5
- Паттерны проектирования JSON API — эффективное использование UUID в API-ответах