alltools.one
Development
2025-07-03
7 min
alltools.one Team
UUIDIdentifierDatabaseAPIDevelopment

Руководство по 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 v436 символовНетДаДа
UUID v736 символовДаДаДа
ULID26 символовДаДаДа
nanoid21 символНетВероятноДа
АвтоинкрементПеременнаяДаНа таблицуДа
Snowflake ID18–19 символовДаНа системуДа

ULID (Universally Unique Lexicographically Sortable Identifier)

ULID — это компактная альтернатива: 48-битная метка времени + 80-битное случайное значение, закодированное в 26 символах Crockford Base32. Они сортируются лексикографически по времени создания.

Когда использовать автоинкрементные идентификаторы

Последовательные идентификаторы проще и эффективнее для приложений с одной базой данных. Используйте UUID, когда вам нужно:

  • Генерировать идентификаторы несколькими системами независимо
  • Идентификаторы, которые не раскрывают порядок вставки внешним пользователям
  • Идентификаторы, совместимые со слиянием данных в распределённых базах

Вопросы производительности баз данных

Случайные UUID (v4) вызывают фрагментацию B-tree-индекса, потому что вставки происходят в случайные позиции. Это может снизить производительность записи в 2–5 раз по сравнению с последовательными идентификаторами на больших таблицах.

Решения:

  1. Используйте UUID v7: упорядоченные по времени UUID вставляются последовательно, обеспечивая производительность на уровне автоинкремента
  2. Храните в бинарном формате: используйте BINARY(16) вместо CHAR(36), чтобы сэкономить 55% хранилища
  3. Используйте 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 предназначены для идентификации, а не для аутентификации.

Связанные ресурсы

Published on 2025-07-03
UUID Guide: Versions, Formats, and Best Practices | alltools.one