Генератор UUID
Что такое UUID?
UUID (Universally Unique Identifier, Универсальный уникальный идентификатор) — это 128-битное число, используемое для уникальной идентификации информации в компьютерных системах. UUID также называется GUID (Globally Unique Identifier, Глобально уникальный идентификатор).
Характеристики UUID
- Уникальность: Вероятность генерации дублирующихся UUID в распределенной системе крайне низка
- Стандартизация: Соответствует стандарту RFC 4122
- Кроссплатформенность: Может использоваться в различных операционных системах и языках программирования
- Децентрализованность: Не требует центрального координирующего органа
Сценарии применения UUID
- Первичный ключ базы данных: Используется как первичный ключ в распределенных базах данных
- Идентификация файлов: Идентификация файлов в файловой системе
- Управление сессиями: Идентификатор сессии в веб-приложениях
- Очередь сообщений: Уникальная идентификация сообщений
- API интерфейс: Идентификация запросов и ответов API
Детали версий UUID
UUID v1 (на основе времени и узла)
Формат: xxxxxxxx-xxxx-1xxx-yxxx-xxxxxxxxxxxx
Характеристики:
- Основан на текущем времени и ID узла (обычно MAC-адрес)
- Содержит информацию временной метки, может быть отсортирован по времени
- Может раскрывать информацию MAC-адреса
Алгоритм генерации:
// Пример псевдокода
function generateUUIDv1() {
const timestamp = Date.now();
const nodeId = getMACAddress();
const clockSeq = random16Bit();
return formatUUID(timestamp, clockSeq, nodeId);
}
UUID v3 (на основе пространства имен и MD5)
Формат: xxxxxxxx-xxxx-3xxx-yxxx-xxxxxxxxxxxx
Характеристики:
- Основан на MD5-хеше UUID пространства имен и имени
- Одинаковое пространство имен и одинаковое имя всегда производят одинаковый UUID
- Применимо к сценариям, требующим детерминированные UUID
Алгоритм генерации:
function generateUUIDv3(namespace, name) {
const namespaceBytes = parseUUID(namespace);
const nameBytes = Buffer.from(name, 'utf8');
const hash = crypto
.createHash('md5')
.update(Buffer.concat([namespaceBytes, nameBytes]))
.digest();
return formatUUIDv3(hash);
}
UUID v4 (случайная генерация)
Формат: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
Характеристики:
- Полностью случайная генерация
- Наиболее часто используемая версия UUID
- Не содержит значимой информации
Алгоритм генерации:
function generateUUIDv4() {
const bytes = crypto.randomBytes(16);
bytes[6] = (bytes[6] & 0x0f) | 0x40; // Версия 4
bytes[8] = (bytes[8] & 0x3f) | 0x80; // Вариант
return formatUUID(bytes);
}
UUID v5 (на основе пространства имен и SHA-1)
Формат: xxxxxxxx-xxxx-5xxx-yxxx-xxxxxxxxxxxx
Характеристики:
- Основан на SHA-1-хеше UUID пространства имен и имени
- Более безопасен, чем v3 (использует SHA-1 вместо MD5)
- Применимо к сценариям, требующим детерминированные UUID
UUID NIL (пустой UUID)
Формат: 00000000-0000-0000-0000-000000000000
Характеристики:
- Все биты равны 0
- Используется для представления "нет UUID" или "неизвестный UUID"
- Используется как значение по умолчанию в дизайне базы данных
Предопределенные пространства имен
Стандартные UUID пространств имен
- DNS пространство имен:
6ba7b810-9dad-11d1-80b4-00c04fd430c8
- URL пространство имен:
6ba7b811-9dad-11d1-80b4-00c04fd430c8
- OID пространство имен:
6ba7b812-9dad-11d1-80b4-00c04fd430c8
- X.500 DN пространство имен:
6ba7b814-9dad-11d1-80b4-00c04fd430c8
Пример использования
// Генерация UUID v3 с использованием DNS пространства имен
const dnsNamespace = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
const uuid = generateUUIDv3(dnsNamespace, 'example.com');
// Результат: 5df41881-3aed-3515-88a7-2f4a814cf09e
API интерфейс
Генерация одиночного UUID
// Генерация UUID v4
const uuid = generateUUID('v4');
// Генерация UUID v1
const uuid = generateUUID('v1');
// Генерация UUID v3
const uuid = generateUUID('v3', {
namespace: '6ba7b810-9dad-11d1-80b4-00c04fd430c8',
name: 'example.com',
});
Пакетная генерация UUID
// Пакетная генерация UUID
const uuids = generateMultipleUUIDs('v4', 10);
// Генерация UUID разных версий
const mixedUUIDs = generateMultipleUUIDs(['v1', 'v4', 'v5'], 5);
Валидация UUID
// Валидация формата UUID
const isValid = validateUUID('550e8400-e29b-41d4-a716-446655440000');
// Получение версии UUID
const version = getUUIDVersion('550e8400-e29b-41d4-a716-446655440000');
Соображения производительности
Скорость генерации
- v4 (случайный): Самый быстрый, примерно 100 000 UUID/сек
- v1 (время): Средний, примерно 50 000 UUID/сек
- v3/v5 (хеш): Медленнее, примерно 10 000 UUID/сек
Использование памяти
- Каждый UUID занимает 16 байт
- Обратите внимание на использование памяти при пакетной генерации
Безопасность конкурентности
- v4 использует криптографически безопасный генератор случайных чисел
- v1 требует обеспечения уникальности последовательности часов
Лучшие практики
Выбор версии UUID
- Общее использование: Используйте UUID v4
- Требуется временная сортировка: Используйте UUID v1
- Требуется детерминированность: Используйте UUID v3 или v5
- Первичный ключ базы данных: Рекомендуйте UUID v4
Оптимизация хранения
-- Хранение UUID в PostgreSQL
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(255)
);
-- Создание индекса
CREATE INDEX idx_users_id ON users(id);
Оптимизация производительности
// Использование пула объектов для уменьшения выделения памяти
const uuidPool = new Array(1000).fill(null).map(() => generateUUIDv4());
// Использование Web Workers для пакетной генерации
const worker = new Worker('uuid-worker.js');
worker.postMessage({ type: 'generate', count: 1000 });
Часто задаваемые вопросы
В: В чем разница между UUID и GUID?
О: UUID и GUID по сути одинаковы, различаются только названия. UUID — это термин стандарта RFC, GUID — термин Microsoft.
В: Могут ли UUID дублироваться?
О: Теоретически возможно, но вероятность крайне низка. Вероятность дублирования UUID v4 составляет примерно 2,71 × 10^-36.
В: Как выбрать версию UUID?
О: Выбирайте в соответствии с требованиями:
- Требуется случайность: v4
- Требуется временная информация: v1
- Требуется детерминированность: v3 или v5
В: Влияет ли UUID на производительность базы данных?
О: Может влиять, поскольку UUID больше целочисленного первичного ключа. Рекомендации:
- Используйте B-tree индексы
- Рассмотрите использование UUID v1 (временная сортировка)
- Используйте целочисленные первичные ключи в подходящих случаях
Связанные инструменты
Технические спецификации
RFC стандарты
- RFC 4122: Спецификация UUID
- RFC 4122 Section 4.1.3: Определения версий UUID
Поддержка языков программирования
- JavaScript:
crypto.randomUUID()
(Node.js 14.17+) - Python: Модуль
uuid
- Java:
java.util.UUID
- C#:
System.Guid
Последнее обновление: 20 января 2024 года