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 | Как | Свойство |
|---|---|---|
| 1 | MAC + timestamp | раскрывает MAC и время |
| 3 | MD5(namespace + name) | детерминированный |
| 4 | random 122 бита | дефолт, никакого смысла в байтах |
| 5 | SHA-1(namespace + name) | детерминированный |
| 6 | reordered v1 (сортируется по времени) | DB-friendly |
| 7 | unix ms + random | k-sortable, дефолт для новых |
| 8 | custom | своя семантика |
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-...
Хранение в БД
- Postgres: тип
uuid, 16 байт — эффективно - MySQL:
BINARY(16)лучше чемCHAR(36)(36 → 16 = ×2.25 меньше) - MongoDB: BSON UUID type, 16 байт
UUID vs альтернативы
| ID | Размер | Sortable | Notes |
|---|---|---|---|
| UUIDv4 | 128 бит | нет | случайный |
| UUIDv7 | 128 бит | да (ms) | новый дефолт |
| ULID | 128 бит | да | base32, 26 симв |
| KSUID | 160 бит | да | Segment |
| Snowflake | 64 бит | да | Twitter, ID генератор |
| CUID2 | переменный | нет | без времени в открытую |
| NanoID | 21 симв | нет | короче URL-safe |
Утечки
- v1 раскрывает MAC-адрес сервера и время создания
- v6/v7 раскрывает время создания (обычно ok)
- v4 — никакой информации, только 122 бита случайности