UUID: генерация уникальных идентификаторов
UUID версии 1-5, GUID, использование в базах данных, распределённых системах, генерация.
Введение
Когда нужно присвоить уникальный идентификатор объекту — пользователю, заказу, файлу, сессии — разработчики всё чаще выбирают UUID. Этот 128-битный идентификатор выглядит как длинная строка с дефисами, не требует центрального координатора и может генерироваться независимо на разных серверах. В статье разберём, какие версии UUID существуют, чем UUID отличается от GUID, как генерировать идентификаторы правильно и где они применяются. Сгенерировать UUID онлайн можно в нашем UUID-генераторе.
Что такое UUID
UUID (Universally Unique Identifier) — это 128-битное число, используемое для однозначной идентификации объектов в распределённых системах. Стандарт RFC 4122 описывает каноническое представление UUID в виде пяти групп шестнадцатеричных символов, разделённых дефисами:
550e8400-e29b-41d4-a716-446655440000
└──┬──┘ └─┬─┘ └┬┘ └─┬─┘ └────┬────┘
8 4 3 4 12 символовОбщее количество возможных UUID — 2¹²⁸, то есть примерно3,4 × 10³⁸. Если бы всё человечество генерировало по миллиарду UUID в секунду на протяжении века, вероятность коллизии всё равно осталась бы пренебрежимо малой.
UUID vs GUID
GUID (Globally Unique Identifier) — термин, используемый в экосистеме Microsoft. Технически это тот же UUID, но с акцентом на использование в COM-компонентах, реестре Windows и .NET. В большинстве контекстов UUID и GUID взаимозаменяемы, но есть нюанс в порядке байтов при сериализации смешанных версий. На практике для веб-разработки разницы нет.
Версии UUID
Стандарт описывает несколько версий, каждая со своим способом генерации.
UUID v1 — на основе времени и MAC-адреса
v1 использует текущее время (60-битный таймстамп в наносекундах с 15 октября 1582 года) и MAC-адрес сетевой карты. Преимущество — сортируемость по времени создания. Недостаток —暴露ает MAC-адрес устройства, что в некоторых случаях считается нарушением приватности.
UUID v2 — DCE Security
Редко используется. Добавляет поле идентификатора локального пользователя (POSIX UID). На практике почти не встречается.
UUID v3 — на основе MD5
v3 генерируется из MD5-хеша пространства имён и имени. Детерминированный: одинаковые входы дают одинаковый UUID. Используется, когда нужно гарантированно воспроизвести идентификатор.
UUID v4 — случайный
Самая популярная версия. 122 бита заполняются случайными числами, остальные 6 фиксированы и указывают версию. v4 обеспечивает максимальную энтропию и не требует координации между узлами. Именно v4 вы получаете в большинстве онлайн-генераторов.
UUID v5 — на основе SHA-1
Аналог v3, но использует SHA-1 вместо MD5. Рекомендуется как замена v3 в новых проектах, поскольку SHA-1 считается более стойким (хотя для детерминированного идентификатора это не критично).
UUID v6 и v7 (новые)
RFC 9562, опубликованный в 2024 году, добавил v6, v7 и v8. UUID v7 — самый перспективный: он хранит таймстамп в старших битах (как ULID), что делает идентификаторы sortable в индексе БД, и при этом сохраняет случайность в младших битах.
| Версия | Основа | Сортируемый | Типичное применение |
|---|---|---|---|
| v1 | Время + MAC | Да | Legacy-системы |
| v3 | MD5(name) | Нет | Детерминированный ID |
| v4 | Случайный | Нет | Веб-приложения, БД |
| v5 | SHA-1(name) | Нет | Детерминированный ID |
| v7 | Время + случайный | Да | Современные БД, события |
Генерация UUID в разных языках
JavaScript / TypeScript
// Современный Node.js (19.0+)
import { randomUUID } from 'node:crypto';
const uuid = randomUUID();
// => "1b9e6ba9-9f3e-4d2a-b8c1-7e5f3a4d2c10"
// В браузере
const uuid = crypto.randomUUID();
// Библиотека uuid
import { v4, v5, v1 } from 'uuid';
console.log(v4());
console.log(v5('hello', v5.DNS));Python
import uuid
# v4 — случайный
u = uuid.uuid4()
print(u) # 1b9e6ba9-9f3e-4d2a-b8c1-7e5f3a4d2c10
# v1 — на основе времени и MAC
print(uuid.uuid1())
# v5 — на основе SHA-1
NAMESPACE = uuid.NAMESPACE_DNS
print(uuid.uuid5(NAMESPACE, 'example.com'))Go
package main
import (
"fmt"
"github.com/google/uuid"
)
func main() {
u := uuid.New() // v4
fmt.Println(u)
u5 := uuid.NewSHA1(uuid.NameSpaceDNS, []byte("example.com"))
fmt.Println(u5)
}Применение UUID
- Первичные ключи в БД. UUID можно генерировать на клиенте, до отправки на сервер.
- Идентификаторы сессий. Случайный 128-битный токен невозможно угадать.
- Распределённые системы. Микросервисы создают UUID независимо без центра.
- Файловые хранилища. UUID как имя файла исключает коллизии.
- Идентификация событий. Логи и трейсы удобно связывать через UUID.
- API-токены и webhook-идентификаторы. Отслеживание запросов между системами.
UUID в базах данных
Хранить UUID в БД можно тремя способами:
VARCHAR(36)— человекочитаемо, но занимает 36 байт.CHAR(36)— то же, с фиксированной длиной.BINARY(16)— компактно, 16 байт. Рекомендуется для PostgreSQL и MySQL.
PostgreSQL имеет встроенный тип UUID. MySQL/MariaDB с версии 8.0 тоже поддерживают его. Для индексов важно помнить: v4 UUID полностью случаен, поэтому B-tree-индексы фрагментируются. Если вставка идёт интенсивно, рассмотрите v7 — он сортируемый и сохраняет компактность индекса.
-- PostgreSQL: хранимая функция для генерации
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email TEXT UNIQUE NOT NULL
);
-- Вставка без явного ID
INSERT INTO users (email) VALUES ('user@example.com');Валидация UUID
Перед использованием UUID из внешних источников его стоит валидировать. Регулярное выражение ниже проверяет формат любой версии:
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
function isValidUUID(s) {
return UUID_RE.test(s);
}
isValidUUID('550e8400-e29b-41d4-a716-446655440000'); // true
isValidUUID('not-a-uuid'); // falseДля проверки готового идентификатора воспользуйтесь нашимUUID-валидатором.
Коллизии: мифы и реальность
Вероятность коллизии двух v4 UUID оценивается в 2⁻¹²². Согласно парадоксу дней рождений, чтобы с вероятностью 50% получить коллизию, нужно сгенерировать 2⁶¹ (около 2,3 × 10¹⁸) идентификаторов. При темпе генерации 1 миллиард UUID в секунду это заняло бы 73 года. На практике можно считать v4 UUID-коллизии невозможными.
Однако слабые генераторы случайных чисел могут нарушить это свойство. Известны случаи, когда из-за бага в Math.random() или одинакового seed разные узлы выдавали совпадающие UUID. Поэтому всегда используйте криптографически стойкий источник случайности.
Альтернативы UUID
- ULID — 128 бит, сортируемый по времени, base32-представление.
- ObjectId (MongoDB) — 96 бит, содержит таймстамп и идентификатор машины.
- Snowflake (Twitter) — 64 бита, требует координации worker-id.
- nanoid — короткая строка с настраиваемым алфавитом.
- KSUID — 160 бит, сортируемый, от Segment.
Эти форматы удобнее, когда важна компактность или сортируемость. Но UUID остаётся стандартом «по умолчанию» благодаря универсальной поддержке и достаточной длине для большинства задач.
Заключение
UUID — простой и надёжный способ присвоить объекту уникальный идентификатор без центрального координатора. Для большинства веб-приложений оптимальна версия v4: она не зависит от времени и MAC-адреса, легко генерируется на любой стороне. Для новых проектов с интенсивной записью в БД стоит рассмотреть v7 — он сортируемый и дружелюбен к индексам. Сгенерировать UUID онлайн можно в нашемUUID-генераторе, а проверить корректность готовой строки — в UUID-валидаторе.
Попробуйте эти инструменты
Похожие статьи
Как создать надёжный пароль: генератор паролей
Правила создания паролей, длина, символы, энтропия, менеджеры паролей, двухфакторная аутентификация.
MD5 хеш: что это и безопасно ли использовать
Алгоритм MD5, хеширование, коллизии, почему MD5 не для паролей, где ещё можно использовать.
SHA-256: безопасное хеширование
Алгоритм SHA-256, применение в блокчейне, SSL, цифровые подписи, сравнение с MD5 и SHA-1.
Bcrypt: правильное хеширование паролей
Почему bcrypt для паролей, salt, cost factor, сравнение с SHA, лучшие практики безопасности.