Зачем вам 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"
Как это работает?
- Шаблон
xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxxзадает формат. - Символ 'x' заменяется на случайную шестнадцатеричную цифру (0-9, a-f).
- Символ 'y' заменяется на цифру, которая по стандарту должна быть 8, 9, a или b (версия 4 UUID).
- Цифра '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 — отличный выбор.