UUID — что это такое: версии, GUID и чем они отличаются
UUID — что это такое простыми словами: устройство идентификатора, версии v4 и v7, чем GUID отличается от UUID и где идентификаторы используются.
Посчитайте прямо здесь: UUID → Validation Result
Открыть инструмент целиком →Введение
Когда нужно присвоить уникальный идентификатор объекту — пользователю, заказу, файлу, сессии — разработчики всё чаще выбирают 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: разбор по частям
Разберём тот же 550e8400-e29b-41d4-a716-446655440000 по частям. Внутри — 32 шестнадцатеричные цифры, то есть 128 бит (одна hex-цифра кодирует ровно 4 бита), разбитые дефисами на пять групп 8-4-4-4-12. Почти всё это пространство занимает полезная нагрузка версии, но два места зарезервированы всегда:
550e8400-e29b-41d4-a716-446655440000
│ └─ вариант: первый символ четвёртой группы
└────── версия: первый символ третьей группыПервая цифра третьей группы — номер версии. В примере стоит 4: перед вами случайный v4. Единица означала бы v1 (время плюс MAC-адрес), семёрка — v7 (время плюс случайные биты). Первая цифра четвёртой группы — вариант, он описывает семейство стандартов: символы 8, 9, a и b означают вариант RFC 4122. Если там стоит что-то другое, строка форматом на UUID не тянет — валидатор её отвергнет.
Короткая шпаргалка по всем версиям v1–v7 — чем генерируется каждая и когда её брать:
| Версия | Чем генерируется | Когда применять |
|---|---|---|
| v1 | 60-битный таймстамп + MAC-адрес | Только в унаследованных системах: раскрывает MAC |
| v2 | Таймстамп + номер пользователя (DCE Security) | Почти нигде, встречается в legacy-системах DCE |
| v3 | MD5-хеш имени и пространства имён | Нужен воспроизводимый ID, а v5 недоступен |
| v4 | 122 случайных бита из криптогенератора | Выбор по умолчанию: API, сессии, ключи БД |
| v5 | SHA-1-хеш имени и пространства имён | Воспроизводимый ID из имени: DNS, URL, объекты |
| v6 | Таймстамп v1, переставленный для сортировки | Миграция с v1, когда нужна сортировка по времени |
| v7 | Миллисекундный таймстамп + 74 случайных бита | Нагруженные БД и логи: индекс не фрагментируется |
Стандарты UUID
Формат закреплён в стандартах: RFC 4122 (2005) — классические версии v1–v5, RFC 9562 (май 2024) — добавил сортируемые v6, v7 и v8, а также ISO/IEC 9834-8 и ITU-T X.667 дублируют спецификацию на уровне ISO и МСЭ.
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 давно вышел за пределы серверного кода — строки с дефисами окружают любого пользователя Windows и браузера:
- Windows. Идентификатор устройства в разделе «О системе», ветки CLSID в реестре, зарегистрированные COM-компоненты — везде GUID. Microsoft генерирует их при установке почти каждой программы.
- Ссылки на документы. Адрес Google Docs содержит длинный непредсказуемый набор символов после
/d/. Технически это не UUID, но принцип тот же: перебирать такие ссылки бессмысленно. - Заказы и платежи. Номер заказа в письме магазина или ссылка на оплату — часто UUID вместо порядкового номера, чтобы чужие заказы нельзя было угадать.
- Идентификаторы телефона. Рекламный идентификатор Android (Google Advertising ID) и IDFA на iOS оформлены как UUID: приложения видят их, пользователь может сбросить в настройках.
Отдельный случай — базы данных. Автоинкрементный ключ в URL раскрывает масштаб: по адресу /orders/1487 видно, что заказов меньше полутора тысяч, а соседние номера существуют. UUID непредсказуем — не выдаёт количество записей и не даёт перебирать чужие объекты. Поэтому публичные ссылки строят на нём, а автоинкремент оставляют внутренним ключом.
Nil и Max UUID
Два служебных значения: Nil UUID — все нули (00000000-0000-0000-0000-000000000000) — маркер «идентификатора нет»; Max UUID — все единицы (ffffffff-ffff-ffff-ffff-ffffffffffff). Оба закреплены в RFC 9562 и не должны получаться при генерации.
Вероятность коллизии
Пространство v4 — 2^122 вариантов. При генерации миллиарда UUID в секунду первое столкновение произойдёт в среднем через 100 лет, а чтобы получить хотя бы один шанс из миллиарда на дубликат, нужно нагенерировать около 2,6 квинтиллиона значений. На практике это значит: проверять сгенерированные UUID на уникальность не нужно — нужно проверять, что генератор использует криптостойкий источник случайности.
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 vs GUID vs ULID
GUID — не отдельный формат, а то же самое в терминологии Microsoft: те же 128 бит, те же версии, те же дефисы. Часто GUID оборачивают в фигурные скобки — так его показывает реестр Windows и Visual Studio. Настоящая альтернатива другая — ULID: тоже 128 бит, но 48 из них занимает таймстамп в старших разрядах, поэтому идентификаторы сортируются по времени создания, а записываются 26 символами base32 без дефисов.
| Формат | Размер | Сортируемость | Запись | Где встречается |
|---|---|---|---|---|
| UUID v4 | 128 бит | Нет | 36 символов, hex с дефисами | Веб, API, БД |
| GUID | 128 бит (тот же UUID) | Зависит от версии | 36 символов, часто в скобках | Windows, COM, .NET |
| ULID | 128 бит | Да, по времени | 26 символов base32 | Очереди, логи, БД с интенсивной записью |
На практике выбор простой: GUID достаётся «в нагрузку» от Windows-стека, ULID — осознанное решение под высокие нагрузки, в остальных случаях хватает UUID.
Заключение
UUID — простой и надёжный способ присвоить объекту уникальный идентификатор без центрального координатора. Для большинства веб-приложений оптимальна версия v4: она не зависит от времени и MAC-адреса, легко генерируется на любой стороне. Для новых проектов с интенсивной записью в БД стоит рассмотреть v7 — он сортируемый и дружелюбен к индексам. Сгенерировать UUID онлайн можно в нашемUUID-генераторе, а проверить корректность готовой строки — в UUID-валидаторе.
Частые вопросы
Чем UUID отличается от GUID?
Практически ничем: GUID — название того же 128-битного идентификатора в экосистеме Microsoft (COM, SQL Server, .NET). Различия технические: GUID в Windows исторически хранится в mixed-endian, а термин UUID — нейтральный стандартный. В разговоре разработчиков это синонимы.
Могут ли сгенерированные UUID совпасть?
Теоретически да, практически — вероятность ничтожна: пространство 2^122 вариантов. При генерации миллиарда UUID в секунду столкновение в среднем случится через ~100 лет. Для v4 совпадение возможно только из-за неисправного генератора случайных чисел; v1 зависит от MAC-адреса и времени.
Как проверить UUID в JavaScript?
Регулярным выражением: /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i. Оно проверяет формат, но не версию. Для валидации версии сверяйте первый символ третьего блока с ожидаемой (например, «4» для v4) — или воспользуйтесь нашим валидатором UUID.
Почему UUID лучше автоинкремента для публичных идентификаторов?
Последовательный ID раскрывает объём данных: по адресу /orders/1487 понятно, что заказов меньше полутора тысяч, и их можно перебирать. UUID непредсказуем, поэтому безопасен в URL, ссылках из писем и публичных API. Внутри базы автоинкремент при этом можно сохранить как суррогатный ключ.
Что такое Nil UUID?
Это особый идентификатор из одних нулей: 00000000-0000-0000-0000-000000000000. Он не генерируется случайно, а используется как «пустое значение» — маркер отсутствия идентификатора в системах, где null неудобен. Стандарт RFC 9562 закрепляет также Max UUID из всех единиц (0xFFFFFFFF-...).
Что такое UUID простыми словами?
Это случайный номер из 32 шестнадцатеричных цифр (0–9, a–f), разбитый дефисами на пять групп: 550e8400-e29b-41d4-a716-446655440000. Похож на серийный номер, только гарантия уникальности глобальная: сколько бы устройств ни генерировали номера одновременно, совпадение практически исключено. Поэтому UUID присваивают заказам, файлам и записям без центрального учёта.
Попробуйте эти инструменты
Похожие статьи
Как создать надёжный пароль: генератор паролей
Правила создания паролей, длина, символы, энтропия, менеджеры паролей, двухфакторная аутентификация.
MD5 хеш: что это и безопасно ли использовать
Алгоритм MD5, хеширование, коллизии, почему MD5 не для паролей, где ещё можно использовать.
SHA-256 — что это такое простыми словами: как работает и где применяется
SHA-256 — что это за хеш простыми словами: как работает алгоритм, где применяется (биткоин, SSL, подписи), чем отличается от MD5 и SHA-1.
Bcrypt: правильное хеширование паролей
Почему bcrypt для паролей, salt, cost factor, сравнение с SHA, лучшие практики безопасности.