crypto.randomUUID — встроенный метод Web Crypto API, предназначенный
для генерации криптографически стойких идентификаторов UUID версии 4.
Метод является частью пространства имен crypto и доступен в
современных браузерах и средах, реализующих спецификацию Web Crypto.
UUID (Universally Unique Identifier) используется для создания
уникальных идентификаторов объектов, сессий, записей, ключей и других
сущностей, где требуется высокая вероятность уникальности без
централизованной координации. В отличие от самописных генераторов на
основе Math.random(), данный метод опирается на
криптографически безопасный генератор случайных чисел операционной
системы.
Метод не принимает аргументов и возвращает строку:
crypto.randomUUID()
Результат соответствует формату UUID v4:
xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
где:
x — случайные шестнадцатеричные символы4 — фиксированный номер версии UUIDy — определяет вариант (вариант RFC 4122)Пример значения:
3b12f1df-5232-4f6b-9a3c-7c2d2d1c8f1a
Внутри реализации используется CSPRNG (Cryptographically Secure Pseudo-Random Number Generator), предоставляемый операционной системой через Web Crypto API. Это делает результат:
Генерация не зависит от времени, состояния приложения или seed, доступного разработчику.
UUID версии 4 строго определяет расположение битов:
Формат разбит на 5 групп:
8-4-4-4-12 символов
Пример:
xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
Где:
4 (версия)8, 9,
a или b (вариант RFC 4122)Используется для генерации уникальных ID:
const userId = crypto.randomUUID();
const sessionId = crypto.randomUUID();
const messageId = crypto.randomUUID();
В отличие от инкрементных идентификаторов:
const cache = new Map();
const key = crypto.randomUUID();
cache.set(key, { data: "value" });
В интерфейсах приложений UUID часто используется до синхронизации с сервером:
const tempItem = {
id: crypto.randomUUID(),
text: "Новая задача",
synced: false
};
Недостатки:
const id = Math.random().toString(36).slice(2);
Такой подход не гарантирует глобальную уникальность.
Библиотеки типа uuid:
import { v4 as uuidv4 } from "uuid";
uuidv4();
Преимущества crypto.randomUUID():
Метод реализован на уровне движка браузера и использует нативные механизмы генерации случайных байтов. В большинстве случаев он:
Поддерживается в:
crypto)Проверка доступности:
if (crypto.randomUUID) {
const id = crypto.randomUUID();
}
Метод подходит для:
Но не предназначен для:
Причина: UUID предназначен для уникальности, а не для секретности.
const password = crypto.randomUUID(); // недопустимо
UUID не предназначен для хранения секретной информации.
UUID v4 не содержит временной компоненты, поэтому:
Теоретическая вероятность коллизии UUID v4 крайне мала из-за объема пространства 128 бит. Практически при корректной реализации CSPRNG вероятность столкновения пренебрежимо мала даже при миллиардах генераций.
Метод является частью crypto объекта, который также
включает:
crypto.getRandomValues()crypto.subtle (криптографические операции)randomUUID() является высокоуровневым удобным методом,
построенным поверх генератора случайных значений.
В распределённых системах UUID часто используется для:
const requestId = crypto.randomUUID();
console.log("Request:", requestId);
Низкоуровневый эквивалент с использованием
getRandomValues:
function uuidv4() {
const bytes = new Uint8Array(16);
crypto.getRandomValues(bytes);
bytes[6] = (bytes[6] & 0x0f) | 0x40;
bytes[8] = (bytes[8] & 0x3f) | 0x80;
const hex = [...bytes].map(b => b.toString(16).padStart(2, "0"));
return (
hex.slice(0, 4).join("") + "-" +
hex.slice(4, 6).join("") + "-" +
hex.slice(6, 8).join("") + "-" +
hex.slice(8, 10).join("") + "-" +
hex.slice(10, 16).join("")
);
}
crypto.randomUUID() выполняет аналогичную задачу на
уровне движка, но без необходимости ручной реализации.