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:

550e8400-e29b-41d4-a716-446655440000

В UUID v4 122 из 128 бит случайны. Оставшиеся 6 бит — фиксированные поля, предусмотренные спецификацией: 4 бита кодируют версию (0100 = 4) и 2 бита кодируют вариант RFC 4122 (10). Именно поэтому третья группа всегда начинается с 4, а четвёртая — с 8, 9, a или b.

Анатомия UUID v4

Разбор 550e8400-e29b-41d4-a716-446655440000:

СегментБитыЗначение
550e840032 случайныхtime_low (название историческое — полностью случайно в v4)
e29b16 случайныхtime_mid (историческое название — полностью случайно в v4)
41d44 фиксированных + 12 случайныхВерсионный ниббл 4 (двоичное 0100) + 12 случайных бит
a7162 фиксированных + 14 случайныхБиты варианта 10 (старшие биты первого байта) + 14 случайных бит
44665544000048 случайныхnode (полностью случайно в v4)
Note:Ниббл варианта в начале четвёртой группы всегда равен 8, 9, a или b — потому что два старших бита этого байта фиксированы на 10 (маркер варианта RFC 4122), оставляя два оставшихся бита свободными.

UUID v4 и другие версии

RFC 4122 определяет пять версий UUID. Каждая решает свою задачу:

UUID v1Временная метка + MAC

Сочетает 60-битную временную метку (интервалы 100 наносекунд с октября 1582 г.) с MAC-адресом хоста. Монотонно возрастает в пределах одной машины.

Use when: вам нужны упорядоченные по времени ID и вы не против раскрытия идентификатора сервера и времени генерации.

UUID v3Хэш MD5

Детерминированный: одинаковые пространство имён + имя всегда дают одинаковый UUID. Использует хэширование MD5.

Use when: вам нужны воспроизводимые ID из известного пространства имён (например, DNS-имена). Предпочтительнее v5, чем v3.

UUID v4Случайный

122 бита криптографически защищённой случайности. Нет временной метки, MAC-адреса или пространства имён. Наиболее распространённый выбор общего назначения.

Use when: вам нужны уникальные ID без структурного смысла и с максимальной конфиденциальностью.

UUID v5Хэш SHA-1

Как v3, но использует SHA-1. По-прежнему детерминированный от пространства имён + имени.

Use when: вам нужны воспроизводимые идентификаторы с адресацией по содержимому (например, стабильные ID для ресурсов, идентифицированных URL).

UUID v7Упорядоченный по времени случайный

Новее (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 к каждой строке лога и отрезку распределённой трассировки. Не нужна координация между сервисами или машинами.

Note:Если ваш вариант использования требует сортируемых ID (например, вы хотите, чтобы строки в БД кластеризовались по времени вставки), рассмотрите UUID v7. UUID v4 намеренно случаен и вызовет фрагментацию индекса в B-tree при высокой частоте вставок.

Вероятность коллизии

При 122 случайных битах пространство UUID v4 содержит 2122 ≈ 5,3 × 1036 возможных значений. Вероятность коллизии следует задаче о парадоксе дней рождения:

Сгенерировано UUIDВероятность коллизии
1 миллиард (109)~1 из 5,3 × 1018
1 триллион (1012)~1 из 5,3 × 1012
1018 (объём экзабайта)~1 из 5 300

Широко известный ориентир: чтобы получить 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+. Установка пакетов не требуется.

js
// 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)

js
const { v4: uuidv4 } = require('uuid')

const id = uuidv4()
// → "110e8400-e29b-41d4-a716-446655440000"

Python

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

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

toml
# Cargo.toml
[dependencies]
uuid = { version = "1", features = ["v4"] }
rust
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 принимают оба формата.

js
const id = crypto.randomUUID()              // "550e8400-e29b-41d4-a716-446655440000"
const compact = id.replaceAll('-', '')     // "550e8400e29b41d4a716446655440000"

Руководства по языкам