UUID v4 Generator
Generate cryptographically random UUID v4
…
Форматировать
UUID v4 — наиболее широко используемая версия UUID в современном программном обеспечении. В отличие от своих аналогов, которые извлекают биты из временной метки или хэша пространства имён, UUID v4 построен полностью на случайных данных — что делает его простейшим и наиболее универсальным выбором, когда вам нужен уникальный идентификатор без каких-либо метаданных о его происхождении.
Этот генератор использует crypto.randomUUID() — нативный API браузера и Node.js, который получает энтропию из криптографически защищённого генератора случайных чисел операционной системы — того же источника, что используется для ключевого материала TLS.
Что такое UUID v4?
Universally Unique Identifier (UUID) — это 128-битная метка, стандартизированная в RFC 4122. Обычно она представляется в виде 32 шестнадцатеричных цифр, сгруппированных дефисами по шаблону 8-4-4-4-12:
В UUID v4 122 из 128 бит случайны. Оставшиеся 6 бит — фиксированные поля, предусмотренные спецификацией: 4 бита кодируют версию (0100 = 4) и 2 бита кодируют вариант RFC 4122 (10). Именно поэтому третья группа всегда начинается с 4, а четвёртая — с 8, 9, a или b.
Анатомия UUID v4
Разбор 550e8400-e29b-41d4-a716-446655440000:
| Сегмент | Биты | Значение |
|---|---|---|
| 550e8400 | 32 случайных | time_low (название историческое — полностью случайно в v4) |
| e29b | 16 случайных | time_mid (историческое название — полностью случайно в v4) |
| 41d4 | 4 фиксированных + 12 случайных | Версионный ниббл 4 (двоичное 0100) + 12 случайных бит |
| a716 | 2 фиксированных + 14 случайных | Биты варианта 10 (старшие биты первого байта) + 14 случайных бит |
| 446655440000 | 48 случайных | node (полностью случайно в v4) |
8, 9, a или b — потому что два старших бита этого байта фиксированы на 10 (маркер варианта RFC 4122), оставляя два оставшихся бита свободными.UUID v4 и другие версии
RFC 4122 определяет пять версий UUID. Каждая решает свою задачу:
Сочетает 60-битную временную метку (интервалы 100 наносекунд с октября 1582 г.) с MAC-адресом хоста. Монотонно возрастает в пределах одной машины.
Use when: вам нужны упорядоченные по времени ID и вы не против раскрытия идентификатора сервера и времени генерации.
Детерминированный: одинаковые пространство имён + имя всегда дают одинаковый UUID. Использует хэширование MD5.
Use when: вам нужны воспроизводимые ID из известного пространства имён (например, DNS-имена). Предпочтительнее v5, чем v3.
122 бита криптографически защищённой случайности. Нет временной метки, MAC-адреса или пространства имён. Наиболее распространённый выбор общего назначения.
Use when: вам нужны уникальные ID без структурного смысла и с максимальной конфиденциальностью.
Как v3, но использует SHA-1. По-прежнему детерминированный от пространства имён + имени.
Use when: вам нужны воспроизводимые идентификаторы с адресацией по содержимому (например, стабильные ID для ресурсов, идентифицированных URL).
Новее (RFC 9562, 2024). Кодирует Unix-временную метку в миллисекундах в старших битах, затем случайные биты. Сортируемый и удобный для баз данных.
Use when: вам нужны ID, удобные для индексов БД, с естественной временной сортировкой (предпочтительнее v1 для новых проектов).
Когда использовать UUID v4
UUID v4 — правильный инструмент в подавляющем большинстве ситуаций, когда вам просто нужен «уникальный ID» без дополнительных ограничений:
ID пользователей и аккаунтов
Непрозрачные ID пользователей, которые не раскрывают ничего о времени создания аккаунта или идентификаторе сервера. Не поддаются перечислению или угадыванию.
Первичные ключи баз данных
Работает с любым движком баз данных. UUID v4 безопасно генерировать на стороне клиента и объединять из распределённых источников без координации — не нужна таблица последовательностей или центральный сервис ID.
ID сессий и токенов
122 бита случайности делают перебор практически невозможным — по стойкости сопоставимо с 122-битным случайным токеном.
Имена файлов и объектов
Безопасные от дублирования имена файлов для загрузок, ключи объектов S3 или записи кэша. Нет риска, что два клиента запишут по одному ключу.
Ключи идемпотентности
Генерируйте UUID на клиенте перед отправкой запроса. Сервер может безопасно дедуплицировать повторные запросы без общего счётчика.
Корреляция и ID трассировки
Прикрепляйте UUID к каждой строке лога и отрезку распределённой трассировки. Не нужна координация между сервисами или машинами.
Вероятность коллизии
При 122 случайных битах пространство UUID v4 содержит 2122 ≈ 5,3 × 1036 возможных значений. Вероятность коллизии следует задаче о парадоксе дней рождения:
Широко известный ориентир: чтобы получить 50% вероятность одной коллизии, нужно сгенерировать примерно 2,71 × 1018 UUID. При скорости 1 миллиард UUID в секунду это займёт примерно 85 лет непрерывной генерации. Для любого реального приложения коллизии не являются практической проблемой.
Примеры кода
JavaScript — Браузер и Node.js 14.17+
Метод crypto.randomUUID() доступен нативно во всех современных браузерах (Chrome 92+, Firefox 95+, Safari 15.4+) и в Node.js 14.17+. Установка пакетов не требуется.
// Browser or Node.js 14.17+
const id = crypto.randomUUID()
// → "110e8400-e29b-41d4-a716-446655440000"
// Generate multiple
const ids = Array.from({ length: 5 }, () => crypto.randomUUID())Node.js — более старые версии (пакет uuid)
const { v4: uuidv4 } = require('uuid')
const id = uuidv4()
// → "110e8400-e29b-41d4-a716-446655440000"Python
import uuid # Generate a UUID v4 id = str(uuid.uuid4()) # → '110e8400-e29b-41d4-a716-446655440000' # The uuid module uses os.urandom() — cryptographically secure print(uuid.uuid4().hex) # without hyphens # → '110e8400e29b41d4a716446655440000'
Go
import "github.com/google/uuid" id := uuid.New().String() // → "110e8400-e29b-41d4-a716-446655440000" // Or using the standard library (Go 1.20+ with math/rand/v2 is NOT cryptographic) // Always prefer github.com/google/uuid for production use
Rust
# Cargo.toml
[dependencies]
uuid = { version = "1", features = ["v4"] }use uuid::Uuid; let id = Uuid::new_v4().to_string(); // → "110e8400-e29b-41d4-a716-446655440000"
Часто задаваемые вопросы
Является ли UUID v4 криптографически защищённым?
UUID v4 сам по себе не является примитивом безопасности — это формат идентификатора. Однако при генерации через crypto.randomUUID() (браузер или Node.js) базовая энтропия является криптографически защищённой. Не используйте генераторы UUID на основе Math.random() в контекстах, критичных для безопасности.
Могут ли два UUID v4 когда-либо быть равны?
Теоретически да, но практически нет. Вероятность генерации дубликата астрономически мала. Коллизия UUID v4 рассматривается как невозможная при проектировании производственных систем.
UUID v4 vs nanoid — что выбрать?
Оба являются генераторами случайных ID, использующими CSPRNG. Ключевые отличия:
- UUID v4 следует стандарту RFC 4122, распознаётся каждой базой данных и фреймворком, и не требует зависимостей (нативный
crypto.randomUUID()). - nanoid использует URL-безопасный алфавит и по умолчанию короче (21 символ против 36). Требует npm-пакет.
Предпочитайте UUID v4 для совместимости с внешними системами. Предпочитайте nanoid для более коротких ID.
Хранить ли UUID как строки или в бинарном виде в базах данных?
Для большинства баз данных хранение в виде столбца UUID или BINARY(16) эффективнее, чем VARCHAR(36). PostgreSQL имеет нативный тип uuid. MySQL и MariaDB работают с BINARY(16). SQLite хранит как TEXT.
Зачем в UUID v4 дефисы — и можно ли их опустить?
Дефисы являются частью канонического представления UUID (RFC 4122), но чисто косметические. Опуская их, вы получаете компактную 32-символьную шестнадцатеричную строку. Большинство парсеров UUID принимают оба формата.
const id = crypto.randomUUID() // "550e8400-e29b-41d4-a716-446655440000"
const compact = id.replaceAll('-', '') // "550e8400e29b41d4a716446655440000"