Гайд по генерации GUID/UUID в JavaScript: от теории до кода

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Зачем вам GUID/UUID и почему это проще, чем кажется?

Вы когда-нибудь задумывались, как сайты и приложения отличают одну запись в базе данных от другой? Или как ваш браузер запоминает, что именно вы положили в корзину, а не сосед? Секрет часто кроется в маленькой, но могущественной строке — GUID (Globally Unique Identifier) или его более точном брате UUID (Universally Unique Identifier).

На Stack Overflow вопрос «How do I create a GUID / UUID?» собирает тысячи просмотров. Это не случайно. Каждый разработчик рано или поздно сталкивается с задачей: «Мне нужен уникальный ID, но я не хочу тянуть целую библиотеку». Сегодня мы разберем эту тему на JavaScript от и до. Вы узнаете не только как сгенерировать UUID, но и поймете, какой метод выбрать под вашу задачу.

Готовы? Поехали!

Что такое UUID на самом деле? (и почему это не магия)

Прежде чем писать код, давайте разберемся с теорией. UUID — это 128-битное число, которое принято записывать в шестнадцатеричном формате с дефисами. Выглядит это так:

123e4567-e89b-12d3-a456-426614174000

Стандарт RFC 4122 описывает несколько версий UUID. Самые популярные:

  • Версия 4: Случайный UUID. Почти все, что вы найдете в интернете — это он.
  • Версия 1: Основан на времени и MAC-адресе. Устарел, но иногда встречается.
  • Версия 5: Генерируется из имени (например, URL) с помощью хеша SHA-1.

Главное свойство UUID — уникальность без центрального сервера. Вероятность коллизии (совпадения двух ID) настолько мала, что ею можно пренебречь. Говорят, что если генерировать по миллиарду UUID в секунду, то на создание дубликата уйдет около 100 лет. Неплохая гарантия, правда?

Самый правильный способ: crypto.randomUUID()

Если вы пишете современный JavaScript (ES2020+), у вас под рукой есть встроенное решение — crypto.randomUUID(). Этот метод доступен в браузерах и Node.js (начиная с версии 14.17.0).

Вот как это работает:

// Браузер
const myUUID = crypto.randomUUID();
console.log(myUUID); // Вывод: "f47ac10b-58cc-4372-a567-0e02b2c3d479"
// Node.js (современные версии)
const { randomUUID } = require('crypto');
const myUUID = randomUUID();
console.log(myUUID);

Почему это лучший выбор?

  • Безопасность: Использует криптостойкий генератор случайных чисел. Никаких предсказуемых паттернов.
  • Стандарт: Строго соответствует RFC 4122 версии 4.
  • Производительность: Написано на C++ под капотом, работает молниеносно.
  • Ноль зависимостей: Не нужно устанавливать сторонние библиотеки.

Важно: В старых браузерах (Internet Explorer, Safari до 15.4) этот метод может отсутствовать. Если вы поддерживаете таких «динозавров», читайте дальше — у нас есть запасные варианты.

Классический хак: Math.random() + шаблон RFC 4122

До появления crypto.randomUUID() разработчики изобретали велосипеды. Самый популярный вариант — использовать Math.random() для подстановки цифр в шаблон UUID. Этот код гуляет по интернету уже больше 10 лет:

function generateUUID() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        const r = Math.random() * 16 | 0;
        const v = c === 'x' ? r : (r & 0x3 | 0x8);
        return v.toString(16);
    });
}

console.log(generateUUID()); // Вывод: "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"

Как это работает?

  1. Шаблон xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx задает формат.
  2. Символ 'x' заменяется на случайную шестнадцатеричную цифру (0-9, a-f).
  3. Символ 'y' заменяется на цифру, которая по стандарту должна быть 8, 9, a или b (версия 4 UUID).
  4. Цифра '4' в позиции 13 — это маркер версии.

Плюсы: Простота, работает везде, не требует импортов.
Минусы: Math.random() не является криптостойким. Для баз данных это не критично, но для токенов безопасности — плохая идея.

Node.js: библиотека uuid (когда нужно больше контроля)

В Node.js-экосистеме есть золотой стандарт — пакет uuid. Его устанавливают 30+ миллионов раз в неделю. Почему он так популярен?

Установка:

npm install uuid

Использование:

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

const myUUID = uuidv4();
console.log(myUUID); // Вывод: "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed"

Библиотека поддерживает все версии UUID (v1, v3, v4, v5) и дает вам выбор: использовать криптостойкий генератор или нет. Для большинства задач v4 — идеальный выбор.

Когда это нужно?

  • Если вы работаете в старом Node.js (до 14.17).
  • Если вам нужна версия UUID, отличная от v4 (например, v5 для создания ID из URL).
  • Если хотите быть уверены в обратной совместимости.

Короткие уникальные ID: альтернатива UUID

Иногда стандартный UUID слишком длинный. Для URL-сокращателей, коротких ссылок или ID в чатах лучше подходят NanoID. Это не UUID, но решает ту же задачу:

// Установка: npm install nanoid
const { nanoid } = require('nanoid');

const shortID = nanoid(); // По умолчанию 21 символ
console.log(shortID); // Вывод: "V1StGXR8_Z5jdHi6B-myT"

const customLength = nanoid(10); // Можно задать длину
console.log(customLength); // Вывод: "IRFa-VaY2b"

NanoID использует криптостойкий генератор и позволяет задавать алфавит. Он короче UUID (21 символ против 36) и так же уникален. Для веб-приложений, баз данных и API — отличный выбор.

Сравнение методов: что выбрать?

Блоги

Рекомендаций по книгам