w

Генератор UUID

Что такое UUID?

UUID (Universally Unique Identifier, Универсальный уникальный идентификатор) — это 128-битное число, используемое для уникальной идентификации информации в компьютерных системах. UUID также называется GUID (Globally Unique Identifier, Глобально уникальный идентификатор).

Характеристики UUID

  • Уникальность: Вероятность генерации дублирующихся UUID в распределенной системе крайне низка
  • Стандартизация: Соответствует стандарту RFC 4122
  • Кроссплатформенность: Может использоваться в различных операционных системах и языках программирования
  • Децентрализованность: Не требует центрального координирующего органа

Сценарии применения UUID

  1. Первичный ключ базы данных: Используется как первичный ключ в распределенных базах данных
  2. Идентификация файлов: Идентификация файлов в файловой системе
  3. Управление сессиями: Идентификатор сессии в веб-приложениях
  4. Очередь сообщений: Уникальная идентификация сообщений
  5. 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

  1. Общее использование: Используйте UUID v4
  2. Требуется временная сортировка: Используйте UUID v1
  3. Требуется детерминированность: Используйте UUID v3 или v5
  4. Первичный ключ базы данных: Рекомендуйте 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 года

Was this page helpful?