Все статьи
Криптография и безопасность

UUID: генерация уникальных идентификаторов

UUID версии 1-5, GUID, использование в базах данных, распределённых системах, генерация.

23 марта 2025
7 мин чтения
ConvertHub
#uuid#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-системы
v3MD5(name)НетДетерминированный ID
v4СлучайныйНетВеб-приложения, БД
v5SHA-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 в БД можно тремя способами:

  1. VARCHAR(36) — человекочитаемо, но занимает 36 байт.
  2. CHAR(36) — то же, с фиксированной длиной.
  3. 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-валидаторе.

Попробуйте эти инструменты

Похожие статьи