UUID

UUID (Universally Unique Identifier), он же GUID в мире Microsoft — 128-битный идентификатор, коллизии практически исключены. Стандарт RFC 9562 (2024, обновил RFC 4122). Формат хранения — 16 байт, представление — 36 символов hex.

Формат

550e8400-e29b-41d4-a716-446655440000
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
        [-]  [-]  [-]  [------]
        M = version (1..8)
        N = variant (обычно 8/9/a/b — RFC 4122)

128 бит = 32 hex-символа + 4 дефиса = 36 символов.

Версии

vКакСвойство
1MAC + timestampраскрывает MAC и время
3MD5(namespace + name)детерминированный
4random 122 битадефолт, никакого смысла в байтах
5SHA-1(namespace + name)детерминированный
6reordered v1 (сортируется по времени)DB-friendly
7unix ms + randomk-sortable, дефолт для новых
8customсвоя семантика

UUIDv4

Просто 122 случайных бита + фиксированные version+variant. Вероятность коллизии при 1 миллиарде UUID — примерно 1 к 10¹⁸. На практике коллизий не бывает.

# Linux
uuidgen
cat /proc/sys/kernel/random/uuid

# Python
import uuid
uuid.uuid4()

# JavaScript
crypto.randomUUID()

# SQL
SELECT gen_random_uuid();  -- Postgres
SELECT UUID();             -- MySQL

UUIDv7 — новый дефолт

Проблема v4: случайный порядок → плохой primary key в B-tree индексах (page splits, cache misses, index fragmentation). v7 решает — начинается с ms-timestamp.

018f4b21-2a3c-7abc-9def-0123456789ab
└── 48 bit unix ms ──┘ ↑    ↑
                     ver  variant + random

Плюсы: сортируемый по времени (k-sortable), совместим с UUID-инфраструктурой, лучше как PK. Adopting: Postgres 18+ built-in, MySQL 8.4+ (UUID_v7).

Namespaces (v3/v5)

# одинаковый URL → одинаковый UUID
uuid5(NAMESPACE_URL, "https://example.com/a") 
  → 4fd35a71-e50b-53a3-a3e9-...
# всегда тот же

# заготовки namespace
NAMESPACE_DNS  = 6ba7b810-9dad-11d1-80b4-00c04fd430c8
NAMESPACE_URL  = 6ba7b811-9dad-11d1-80b4-00c04fd430c8
NAMESPACE_OID  = 6ba7b812-...
NAMESPACE_X500 = 6ba7b813-...

Хранение в БД

UUID vs альтернативы

IDРазмерSortableNotes
UUIDv4128 битнетслучайный
UUIDv7128 битда (ms)новый дефолт
ULID128 битдаbase32, 26 симв
KSUID160 битдаSegment
Snowflake64 битдаTwitter, ID генератор
CUID2переменныйнетбез времени в открытую
NanoID21 симвнеткороче URL-safe

Утечки

См. также

← на главную