UUID Генератор: Създайте Универсално Уникални Идентификатори Онлайн

Какво е UUID?

UUID (Универсален Уникален Идентификатор) е 128-битов идентификатор, използван в компютърни системи за уникално идентифициране на информация. UUID е стандартизиран съгласно RFC 4122 и благодарение на огромната си ентропия гарантира практически нулева вероятност за колизия – това означава, че два независимо генерирани UUID почти сигурно ще бъдат уникални.

UUID има стандартен формат: xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx, където всяко x е шестнадесетична цифра (0-9, a-f), M обозначава версията на UUID, а N обозначава варианта.

Версии на UUID

UUID v1 (Времево клеймо + MAC адрес)

UUID v1 се базира на текущото времево клеймо (timestamp) и произволна стойност (в браузъра вместо MAC адрес). Използва 100-наносекундни интервали от 15 октомври 1582 г. (Григориански календар).

Употреба:

  • Ситуации, при които е необходимо хронологично подреждане на UUID
  • Отстраняване на грешки и записване (UUID съдържа информация за времето на създаване)
  • Разпределени системи с времева синхронизация

Пример: 6ba7b810-9dad-11d1-80b4-00c04fd430c8

Предимства:

  • UUID могат да бъдат подреждани хронологично според времето на създаване
  • Полезно за одит и отстраняване на грешки
  • Съдържа информация за времевото клеймо

Недостатъци:

  • Потенциален риск за сигурността – съдържа времево клеймо
  • В браузъра не съдържа действителен MAC адрес (заместен с произволна стойност)
  • Лоша локалност на базата данни (времевото клеймо е в битовете от по-нисък порядък)

UUID v3 (MD5 хеш)

UUID v3 се генерира с помощта на MD5 хеш от именно пространство на UUID и име. Детерминистично – едно и също именно пространство + име винаги ще създават едно и също UUID.

Употреба:

  • Преобразуване на URL, DNS имена или други идентификатори в UUID
  • Ситуации, при които е необходимо възпроизводимо UUID
  • Съпоставяне между различни идентификационни системи

Пример: a3bb189e-8bf9-3888-9912-ace4e6543002

Предимства:

  • Детерминистично (един и същ вход = един и същ изход)
  • Идеално за преобразуване на известни идентификатори
  • Без колизии за различни входове

Недостатъци:

  • MD5 е остарял алгоритъм (предпочитайте v5)
  • Изисква именно пространство и име
  • Не може да се възстанови оригиналният вход

UUID v4 (Случайни) - ПРЕПОРЪЧИТЕЛНО

Най-използваната версия на UUID. UUID v4 се генерира чисто случайно с помощта на криптографски сигурен генератор на случайни числа (crypto.getRandomValues()).

Употреба:

  • Първични ключове на база данни
  • Идентификатори на сесии (session IDs)
  • Уникални имена на файлове
  • API токени
  • Общи цели, при които е необходим гарантирано уникален идентификатор

Пример: f47ac10b-58cc-4372-a567-0e02b2c3d479

Предимства:

  • Максимална ентропия и сигурност
  • Без зависимост от време или системни параметри
  • Най-лесна имплементация

Вероятност за колизия: При генериране на 1 милиард UUID за секунда в продължение на 100 години, шансът за колизия е приблизително 0,00000006%.

UUID v5 (SHA-1 хеш)

UUID v5 е същото като v3, но използва SHA-1 вместо MD5. По-модерна и сигурна алтернатива на v3.

Употреба:

  • Същото като v3, но с по-добра сигурност
  • Предпочитано пред v3 за нови проекти
  • Генериране на UUID от URL, DNS имена, OID, X.500 DN

Пример: 886313e1-3b8a-5372-9b90-0c9aee199e5d

Предимства:

  • Детерминистично
  • SHA-1 е по-надежден от MD5
  • Подходящо за съпоставяне между системи

Недостатъци:

  • SHA-1 също се счита за остарял (но все още по-сигурен от MD5)
  • Изисква именно пространство и име

UUID v6 (Подредено времево клеймо)

UUID v6 е подобрена версия на v1 с пренаредени времеви битове за по-добро индексиране в база данни. Проектирано е за решаване на проблеми с локалността в базите данни.

Употреба:

  • Първични ключове на база данни с времево подреждане
  • Системи, изискващи хронологично подреждане и производителност на базата данни
  • По-модерна алтернатива на v1

Пример: 1ec9414c-232a-6b00-b3c8-9e6bdeced846

Предимства:

  • По-добра локалност в базата данни от v1 (времевото клеймо е в битовете от по-висок порядък)
  • Хронологично подреждане
  • Съвместимо със стандарта UUID

Недостатъци:

  • По-малко използвано от v1/v4
  • Все още съдържа времева информация (риск за сигурността)

UUID v7 (Unix времево клеймо)

UUID v7 използва Unix времево клеймо (милисекунди от 1970 г.) + случайни битове. Най-новата версия на UUID с най-добра локалност в база данни.

Употреба:

  • Модерни първични ключове на база данни
  • Системи, изискващи производителност + времево подреждане
  • Заместване на v1/v6 в нови проекти

Пример: 017f22e2-79b0-7cc3-98c4-dc0c0c07398f

Предимства:

  • Най-добра локалност в база данни от всички версии
  • Unix времевото клеймо е стандартно
  • Комбинира предимствата на случайността и времевото подреждане

Недостатъци:

  • Относително нова спецификация (RFC 4122bis)
  • По-малко поддържана в наследени системи

Коя версия на UUID да използвам?

Ръководство за вземане на решение

Имате ли нужда от максимална сигурност и случайност? → Използвайте UUID v4 (най-честият избор)

Имате ли нужда от времево подреждане и производителност на базата данни? → Използвайте UUID v7 (модерно) или UUID v6 (стандартно)

Имате ли нужда от възпроизводими UUID от съществуващи идентификатори? → Използвайте UUID v5 (SHA-1) или UUID v3 (MD5, наследено)

Имате ли нужда от времево клеймо и одит пътека? → Използвайте UUID v1 (наследено, по-лоша производителност на базата данни)

Бази данни

За нови проекти: UUID v7 или v4

  • v7 е идеално за времево подреждане + производителност
  • v4 за максимална случайност без времева информация

За наследени системи: UUID v1 или v6

  • v6 има по-добра локалност в база данни от v1
  • v1 е широко поддържано

Предимства на UUID като първичен ключ:

  • Глобална уникалност – Можете да свързвате данни от различни бази данни без конфликт
  • Сигурност – За разлика от последователните ID (1, 2, 3…), не могат да бъдат отгатнати следващите стойности
  • Разпределени системи – UUID могат да се генерират независимо на множество сървъри без координация
  • Обединяване на бази данни – При сливане на две бази данни не възникват конфликти

Недостатъци:

  • По-голям размер (16 байта срещу 4-8 байта за цяло число)
  • По-бавно индексиране в някои бази данни (използвайте v6/v7 за по-добра производителност)
  • По-малко четимо за човек

API и уеб услуги

  • REST API – Уникални идентификатори за ресурси
  • GraphQL – Глобални идентификатори за възли
  • Webhook-ове – Проследяване на заявки и отговори
  • Токени – Идентификатори на сесии, токени за опресняване

Файлове и съхранение

  • Имена на файлове – Предотвратяване на колизии при качване
  • S3/Облачно съхранение – Уникални пътища до обекти
  • Ключове за кеш – Идентификатори в кеш системи

Frontend приложения

  • React/Vue компоненти – Уникални ключове за списъци
  • Временни ID – ID преди запис в база данни
  • Локално съхранение – Ключове за съхранени данни
  • Offline-first приложения – Генериране на ID без връзка със сървър

Разширени функции на генератора

Генериране на UUID със собствено време

За базирани на време версии (v1, v6, v7) можете да изберете произволно времево клеймо с помощта на инструмент за избор на дата и час. Това е полезно за:

Тестване:

  • Симулация на UUID, създадени в миналото
  • Тестване на времевото подреждане в бази данни
  • Възпроизвеждане на UUID за отстраняване на грешки

Миграция на данни:

  • Генериране на UUID с исторически времеви клейма
  • Попълване на данни с коректни стойности на времевото клеймо
  • Импортиране на данни от различни времеви периоди

Одит и съответствие:

  • Реконструиране на UUID според времето на създаване на записа
  • Ретроактивно генериране на идентификатори

Пример за употреба:

  1. Изберете версия v1, v6 или v7
  2. Задайте дата и час с помощта на инструмента за избор на дата и час
  3. Генерирайте UUID с вашето собствено времево клеймо

UUID, базирани на хеш (v3, v5)

За детерминистични UUID можете да използвате версии v3 (MD5) или v5 (SHA-1):

Как да използвате:

  1. Изберете именно пространство според типа на вашия идентификатор
  2. Въведете име/стойност
  3. Генерирайте UUID

Примери:

NamespaceИме (вход)Употреба
DNSexample.comПреобразуване на име на домейн в UUID
DNSgoogle.comВсеки уебсайт има уникален UUID
URLhttps://example.com/pageПреобразуване на URL в UUID
URLhttps://api.example.com/users/123API крайна точка като UUID
OID1.3.6.1.4.1.343Идентификатор на обект в UUID
X.500CN=John Doe,O=CompanyРазличимо име в UUID

Важни характеристики:

  • Детерминистично: Един и същ вход = винаги едно и също UUID
  • Възпроизводимо: Можете да пресъздадете UUID по всяко време
  • Последователно: Едно и също UUID в различни системи
  • Не може да бъде декодирано: От UUID не може да се възстанови оригиналното име
  • ℹ️ Едно UUID: За v3/v5 винаги се генерира само едно UUID (един и същ вход = един и същ изход)

Практическа употреба:

// Пример: Преобразуване на URL в UUID v5
Namespace: URL
Име: https://example.com/api/users/123
Резултат: 886313e1-3b8a-5372-9b90-0c9aee199e5d

// Един и същ вход = винаги едно и също UUID
Namespace: DNS
Име: google.com
Резултат: винаги едно и също UUID за google.com

Как безопасно да използвате UUID?

Криптографска сигурност

Нашият генератор използва crypto.getRandomValues(), който е криптографски сигурен генератор на случайни числа. За разлика от Math.random(), който е предсказуем и неподходящ за целите на сигурността, crypto.getRandomValues() предоставя истинска ентропия, подходяща за:

  • Генериране на токени за сигурност
  • Идентификатори на сесии (Session IDs)
  • API ключове
  • Криптографски приложения

Сравнение на версиите на UUID

ВерсияОсноваКолизияВремево подрежданеПроизводителност на БДУпотреба
v1Времево клеймо + MACНиска✅ Да❌ По-лошаНаследено, одит
v3MD5 хешНяма (детерминистично)❌ Не⚠️ СреднаПреобразуване (наследено)
v4СлучайниИзключително ниска❌ Не⚠️ СреднаОбща употреба
v5SHA-1 хешНяма (детерминистично)❌ Не⚠️ СреднаПреобразуване (препоръчително)
v6Подредено времево клеймоНиска✅ Да✅ По-добраМодерни БД с време
v7Unix времево клеймоНиска✅ Да✅ Най-добраНови проекти

UUID срещу други идентификатори

ТипРазмерКолизияВремево подрежданеУпотреба
Auto-increment ID4-8 байтаГарантирано уникално в рамките на таблицатаПрости приложения, локални БД
UUID v416 байтаПрактически невъзможнаРазпределени системи, API
UUID v716 байтаПрактически невъзможнаМодерни БД с производителност
ULID16 байтаПрактически невъзможнаUUID + лексикографско подреждане
Snowflake ID8 байтаГарантирано уникално при правилна конфигурацияTwitter, разпределени системи
NanoIDКонфигурируемоЗависи от дължинатаУдобни за URL ID

Имплементация на различни езици

JavaScript/TypeScript

// UUID v4 - Най-лесният начин (модерни браузъри)
const uuid = crypto.randomUUID();

// UUID v4 - Ръчна имплементация
function generateUUIDv4() {
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
    const r = (crypto.getRandomValues(new Uint8Array(1))[0] & 0x0f) >> (c === 'x' ? 0 : 2);
    const v = c === 'x' ? r : (r & 0x3) | 0x8;
    return v.toString(16);
  });
}

// UUID v7 - Препоръчително за бази данни
function generateUUIDv7() {
  const timestamp = Date.now();
  const timeHi = (timestamp >> 16).toString(16).padStart(8, '0');
  const timeLow = (timestamp & 0xFFFF).toString(16).padStart(4, '0');

  const randomBytes = crypto.getRandomValues(new Uint8Array(10));
  const randomHex = Array.from(randomBytes)
    .map(b => b.toString(16).padStart(2, '0'))
    .join('');

  return `${timeHi}-${timeLow}-7${randomHex.substr(0, 3)}-${randomHex.substr(3, 4)}-${randomHex.substr(7)}`;
}

Python

import uuid

# UUID v4
uuid_v4 = str(uuid.uuid4())
# Изход: '6ba7b810-9dad-11d1-80b4-00c04fd430c8'

# UUID v1
uuid_v1 = str(uuid.uuid1())

Java

import java.util.UUID;

// UUID v4
String uuidV4 = UUID.randomUUID().toString();

PHP

// UUID v4 (PHP 7+)
function generateUUID() {
    return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
        mt_rand(0, 0xffff), mt_rand(0, 0xffff),
        mt_rand(0, 0xffff),
        mt_rand(0, 0x0fff) | 0x4000,
        mt_rand(0, 0x3fff) | 0x8000,
        mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
    );
}

C#

using System;

// UUID v4
Guid uuid = Guid.NewGuid();
string uuidString = uuid.ToString();

Най-добри практики

Съхранение на UUID в база данни

PostgreSQL:

CREATE TABLE users (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    email VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

MySQL 8.0+:

CREATE TABLE users (
    id BINARY(16) PRIMARY KEY DEFAULT (UUID_TO_BIN(UUID())),
    email VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Съвет: В MySQL съхранявайте UUID като BINARY(16) вместо CHAR(36) за спестяване на място и по-бързо индексиране.

Валидация на UUID

function isValidUUID(uuid) {
  const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
  return regex.test(uuid);
}

Преобразуване на UUID

// Премахване на тирета
const compact = uuid.replace(/-/g, '');

// Добавяне на тирета обратно
function formatUUID(compactUuid) {
  return [
    compactUuid.substring(0, 8),
    compactUuid.substring(8, 12),
    compactUuid.substring(12, 16),
    compactUuid.substring(16, 20),
    compactUuid.substring(20, 32)
  ].join('-');
}

Отстраняване на проблеми (Troubleshooting)

UUID v3/v5 не работи

Проблем: След избор на v3 или v5 нищо не се генерира

Решение:

  1. ✅ Проверете дали сте попълнили полето “Име” - то е задължително!
  2. ✅ Изберете правилното именно пространство според типа на вашия вход
  3. ✅ Примери за валидни входове:
    • DNS: example.com, google.com
    • URL: https://example.com/page
    • Всякакъв текст: my-application-v1

Съвет: Опитайте първо проста стойност като test и именно пространство DNS.

Времево базирани UUID (v1, v6, v7) имат странно време

Проблем: Генерираният UUID има неочакван времеви печат

Решение:

  1. ✅ Проверете инструмента за избор на дата и час – правилно ли е зададено времето?
  2. ✅ Инструментът за избор на дата и час използва вашата локална часова зона
  3. ✅ Оставете инструмента за избор на дата и час празен за текущото време

UUID не може да се копира

Проблем: Бутонът “Копирай всички” не работи

Решение:

  1. ✅ Проверете дали сте генерирали UUID (да не са празни)
  2. ✅ Някои браузъри изискват HTTPS за Clipboard API
  3. ✅ Алтернативно, изберете текста в текстовото поле и го копирайте ръчно (Ctrl+C)

Често задавани въпроси (ЧЗВ)

Възможно ли е да възникне колизия на UUID? Теоретично да, но вероятността е астрономически малка. При генериране на 1 милиард UUID v4 за секунда в продължение на 100 години, шансът за колизия е приблизително 0,00000006%. На практика колизия никога не се случва.
Подходящо ли е UUID като първичен ключ в база данни? Зависи от сценария на употреба. UUID е идеално за разпределени системи и ситуации, при които е необходима глобална уникалност. За прости приложения с една база данни, авто-инкрементиращ идентификатор може да бъде по-ефективен.
Сигурни ли са UUID, генерирани от този инструмент? Да, използваме Web Crypto API (`crypto.getRandomValues()`), което предоставя криптографски сигурни случайни стойности. Всичко се извършва локално във вашия браузър.
Каква е разликата между версиите на UUID? - **v1**: Времево клеймо + MAC/случайно – хронологично подреждане, по-лоша производителност на БД - **v3/v5**: Базирани на хеш – детерминистични, за преобразуване на известни идентификатори - **v4**: Случайни – най-сигурни, най-използвани - **v6**: Пренаредено времево клеймо – по-добра производителност на БД от v1 - **v7**: Unix времево клеймо – най-добра производителност на БД + времево подреждане
Коя версия на UUID трябва да използвам? За повечето случаи използвайте **v4** (случайни). За бази данни с времево подреждане използвайте **v7** (модерни) или **v6** (стандартни). За преобразуване на известни идентификатори (URL, DNS) използвайте **v5** (SHA-1).
Мога ли да използвам UUID за токени и API ключове? UUID v4 е подходящо за идентификатори на сесии и подобни токени. За API ключове помислете за използване на по-дълги случайни низове (напр. 256-битови стойности) или специализирани библиотеки.
Колко големи са UUID? UUID е 128 бита (16 байта). Във формат низ с тирета заема 36 знака. Без тирета – 32 шестнадесетични знака.

Алтернативи на UUID

ULID (Универсален Уникален Лексикографски Сортируем Идентификатор)

  • 128-битов ID (също като UUID)
  • Лексикографски сортируем по време на създаване
  • По-компактно представяне (26 знака вместо 36)
  • Нечувствително към регистъра base32 кодиране

Пример: 01ARZ3NDEKTSV4RRFFQ69G5FAV

NanoID

  • По-малък размер от UUID (21 знака стандартно)
  • Подходящ за URL (без специални знаци)
  • По-бързо генериране
  • Конфигурируема дължина и азбука

Пример: V1StGXR8_Z5jdHi6B-myT

Snowflake ID (Twitter)

  • 64-битов ID (по-малък от UUID)
  • Сортируем по време
  • Съдържа worker ID и пореден номер
  • Изисква централизирана конфигурация

Пример: 1234567890123456789

Производителност и оптимизация

Скорост на генериране

Нашият генератор може да генерира:

  • 1 UUID: < 1 ms
  • 100 UUID: ~10-20 ms
  • 1000 UUID: ~100-200 ms

Съвети за производителност

  1. Партидно генериране – Ако имате нужда от много UUID, генерирайте ги наведнъж, вместо едно по едно
  2. Съхранение в БД – Индексирайте UUID колони за бързо търсене
  3. Компресия – Съхранявайте UUID в бинарен вид (16 байта) вместо низ (36 байта)
  4. Кеширане – В някои случаи можете предварително да генерирате и кеширате UUID

За разработчици

Структура на UUID v4

xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
|        |    |    |    |
|        |    |    |    └─ 48 бита случайни данни (node)
|        |    |    └────── 16 бита случайни данни с вариант (clock_seq)
|        |    └─────────── 12 бита случайни данни + 4 бита версия (time_hi_and_version)
|        └──────────────── 16 бита случайни данни (time_mid)
└───────────────────────── 32 бита случайни данни (time_low)
  • Версия (4 бита): винаги 0100 (двоично) = 4 (шестнадесетично)
  • Вариант (2-3 бита): винаги 10 (двоично) за RFC 4122

Тестване на UUID

// Jest тест
describe('UUID Генератор', () => {
  test('генерира валиден UUID v4', () => {
    const uuid = generateUUIDv4();
    const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
    expect(regex.test(uuid)).toBe(true);
  });

  test('генерира уникални UUID', () => {
    const uuid1 = generateUUIDv4();
    const uuid2 = generateUUIDv4();
    expect(uuid1).not.toBe(uuid2);
  });
});

Аспекти на сигурността

Какво да НЕ правите с UUID

Не използвайте UUID v1 за чувствителни приложения – Съдържа времево клеймо, което може да бъде риск за сигурността

Не използвайте Math.random() за генериране на UUID – Не е криптографски сигурно

Не разчитайте на UUID за оторизация – UUID може да бъде отгатнат (макар и с изключително малка вероятност)

Не съхранявайте UUID в бисквитки без криптиране – Използвайте подписани бисквитки или JWT

Какво да правите

Използвайте UUID v4 за повечето случаи – Най-висока ентропия и сигурност

Комбинирайте UUID с други мерки за сигурност – За управление на сесии използвайте HTTPS, HttpOnly бисквитки и кратък срок на годност

Валидирайте UUID на сървъра – Винаги проверявайте формата и версията на UUID

Използвайте криптографски сигурни източници на случайностcrypto.getRandomValues() в браузъра, /dev/urandom в Linux

Любопитни факти

  • Брой възможни UUID v4: 2^122 ≈ 5.3 × 10^36 (340 ундецилиона)
  • Необходима колизия: За 50% шанс за колизия трябва да генерирате 2.71 × 10^18 UUID (2.71 квинтилиона)
  • Размер на всички възможни UUID: Ако съхранявахме всеки UUID като 16 байта, цялото пространство щеше да заеме 85 зетабайта (85 милиарда терабайта)
  • Произход: UUID е стандартизиран като част от DCE (Distributed Computing Environment) през 1990 г.