Generátor UUID

Co je UUID?

UUID (Universally Unique Identifier) je 128bitový identifikátor používaný v počítačových systémech pro jedinečnou identifikaci informací. UUID je standardizováno podle RFC 4122 a díky své obrovské entropii zaručuje prakticky nulovou pravděpodobnost kolize – to znamená, že dva nezávisle vygenerované UUID budou téměř jistě unikátní.

UUID má standardní formát: xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx, kde každý x je hexadecimální číslice (0-9, a-f), M označuje verzi UUID a N označuje variantu.

Verze UUID

UUID v1 (Časové razítko + MAC adresa)

UUID v1 je založeno na aktuálním časovém razítku (timestamp) a náhodné hodnotě (v prohlížeči místo MAC adresy). Používá 100-nanosekundové intervaly od 15. října 1582 (Gregoriánský kalendář).

Použití:

  • Situace, kdy potřebujete chronologické řazení UUID
  • Debugging a logování (UUID obsahuje informaci o čase vytvoření)
  • Distribuované systémy s časovou synchronizací

Příklad: 6ba7b810-9dad-11d1-80b4-00c04fd430c8

Výhody:

  • UUID lze řadit chronologicky podle času vytvoření
  • Užitečné pro audit a debugging
  • Obsahuje timestamp informaci

Nevýhody:

  • Potenciální bezpečnostní riziko – obsahuje časové razítko
  • V prohlížeči neobsahuje skutečnou MAC adresu (nahrazeno náhodnou hodnotou)
  • Špatná DB lokalita (timestamp je v low-order bitech)

UUID v3 (MD5 hash)

UUID v3 je generováno pomocí MD5 hashe namespace UUID a názvu. Deterministické – stejný namespace + název vždy vytvoří stejné UUID.

Použití:

  • Převod URL, DNS názvů nebo jiných identifikátorů na UUID
  • Situace, kdy potřebujete reprodukovatelné UUID
  • Mapping mezi různými identifikačními systémy

Příklad: a3bb189e-8bf9-3888-9912-ace4e6543002

Výhody:

  • Deterministické (stejný vstup = stejný výstup)
  • Ideální pro převody známých identifikátorů
  • Žádná kolize pro různé vstupy

Nevýhody:

  • MD5 je zastaralý algoritmus (preferujte v5)
  • Vyžaduje namespace a name
  • Nelze získat zpět původní vstup

UUID v4 (Náhodné) - DOPORUČENO

Nejpoužívanější verze UUID. UUID v4 je generováno čistě náhodně pomocí kryptograficky bezpečného generátoru náhodných čísel (crypto.getRandomValues()).

Použití:

  • Databázové primární klíče
  • Identifikátory relací (session IDs)
  • Unikátní názvy souborů
  • API tokeny
  • Obecné účely, kde potřebujete zaručeně unikátní ID

Příklad: f47ac10b-58cc-4372-a567-0e02b2c3d479

Výhody:

  • Maximální entropie a bezpečnost
  • Žádná závislost na času nebo systémových parametrech
  • Nejjednodušší implementace

Pravděpodobnost kolize: Při generování 1 miliardy UUID za sekundu po dobu 100 let je šance na kolizi přibližně 0,00000006%.

UUID v5 (SHA-1 hash)

UUID v5 je stejné jako v3, ale používá SHA-1 místo MD5. Modernější a bezpečnější alternativa k v3.

Použití:

  • Stejné jako v3, ale s lepší bezpečností
  • Preferované před v3 pro nové projekty
  • Generování UUID z URL, DNS názvů, OID, X.500 DN

Příklad: 886313e1-3b8a-5372-9b90-0c9aee199e5d

Výhody:

  • Deterministické
  • SHA-1 je robustnější než MD5
  • Vhodné pro mapping mezi systémy

Nevýhody:

  • SHA-1 je také považováno za zastaralé (ale stále bezpečnější než MD5)
  • Vyžaduje namespace a name

UUID v6 (Seřazené časové razítko)

UUID v6 je vylepšená verze v1 s přeuspořádanými časovými bity pro lepší DB indexování. Navrženo pro řešení problémů s lokalitou v databázích.

Použití:

  • Databázové primární klíče s časovým řazením
  • Systémy vyžadující chronologické řazení i DB výkon
  • Modernější alternativa k v1

Příklad: 1ec9414c-232a-6b00-b3c8-9e6bdeced846

Výhody:

  • Lepší DB lokalita než v1 (timestamp v high-order bitech)
  • Chronologické řazení
  • Kompatibilní s UUID standardem

Nevýhody:

  • Méně používané než v1/v4
  • Stále obsahuje časové informace (bezpečnostní riziko)

UUID v7 (Unix timestamp)

UUID v7 používá Unix timestamp (milisekundy od 1970) + náhodné bity. Nejnovější verze UUID s nejlepší DB lokalitou.

Použití:

  • Moderní databázové primární klíče
  • Systémy vyžadující výkon + časové řazení
  • Náhrada za v1/v6 v nových projektech

Příklad: 017f22e2-79b0-7cc3-98c4-dc0c0c07398f

Výhody:

  • Nejlepší DB lokalita ze všech verzí
  • Unix timestamp je standardní
  • Kombinuje výhody náhodnosti a časového řazení

Nevýhody:

  • Relativně nová specifikace (RFC 4122bis)
  • Méně podporovaná v legacy systémech

Kterou verzi UUID použít?

Rozhodovací průvodce

Potřebujete maximální bezpečnost a náhodnost? → Použijte UUID v4 (nejběžnější volba)

Potřebujete časové řazení a DB výkon? → Použijte UUID v7 (moderní) nebo UUID v6 (standard)

Potřebujete reprodukovatelné UUID z existujících identifikátorů? → Použijte UUID v5 (SHA-1) nebo UUID v3 (MD5, legacy)

Potřebujete časové razítko a audit trail? → Použijte UUID v1 (legacy, horší DB výkon)

Databáze

Pro nové projekty: UUID v7 nebo v4

  • v7 je ideální pro časové řazení + výkon
  • v4 pro maximální náhodnost bez časových informací

Pro legacy systémy: UUID v1 nebo v6

  • v6 má lepší DB lokalitu než v1
  • v1 je široce podporovaný

Výhody UUID jako primárního klíče:

  • Globální unikátnost – Můžete spojovat data z různých databází bez konfliktu
  • Bezpečnost – Na rozdíl od sekvenčních ID (1, 2, 3…) nelze odhadnout další hodnoty
  • Distribuované systémy – UUID lze generovat nezávisle na více serverech bez koordinace
  • Merge databází – Při sloučení dvou databází nevznikají konflikty

Nevýhody:

  • Větší velikost (16 bytů vs 4-8 bytů pro integer)
  • Pomalejší indexování v některých databázích (používejte v6/v7 pro lepší výkon)
  • Méně čitelné pro člověka

API a webové služby

  • REST API – Unikátní identifikátory pro resources
  • GraphQL – Globální identifikátory pro nodes
  • Webhooky – Tracking požadavků a odpovědí
  • Tokeny – Session IDs, refresh tokeny

Soubory a úložiště

  • Názvy souborů – Prevence kolizí při uploadu
  • S3/Cloud Storage – Unikátní cesty k objektům
  • Cache keys – Identifikátory v cache systémech

Frontend aplikace

  • React/Vue komponenty – Unikátní keys pro lists
  • Temporary IDs – ID před uložením do databáze
  • Local storage – Klíče pro uložená data
  • Offline-first aplikace – Generování ID bez připojení k serveru

Pokročilé funkce generátoru

Generování UUID s vlastním časem

Pro verze založené na čase (v1, v6, v7) můžete vybrat libovolné časové razítko pomocí date-time pickeru. To je užitečné pro:

Testování:

  • Simulace UUID vytvořených v minulosti
  • Testování časového řazení v databázích
  • Reprodukce UUID pro debugging

Migrace dat:

  • Generování UUID s historickými časovými razítky
  • Backfilling dat s korektními timestamp hodnotami
  • Import dat z různých časových období

Audit a compliance:

  • Rekonstrukce UUID podle času vzniku záznamu
  • Retroaktivní generování identifikátorů

Příklad použití:

  1. Vyberte verzi v1, v6 nebo v7
  2. Nastavte datum a čas pomocí date-time pickeru
  3. Vygenerujte UUID s vaším vlastním časovým razítkem

Hash-based UUID (v3, v5)

Pro deterministické UUID můžete použít verze v3 (MD5) nebo v5 (SHA-1):

Jak použít:

  1. Vyberte namespace podle typu vašeho identifikátoru
  2. Zadejte název/hodnotu
  3. Vygenerujte UUID

Příklady:

NamespaceNázev (vstup)Použití
DNSexample.comPřevod doménového jména na UUID
DNSgoogle.comKaždý web má unikátní UUID
URLhttps://example.com/pagePřevod URL na UUID
URLhttps://api.example.com/users/123API endpoint jako UUID
OID1.3.6.1.4.1.343Object Identifier na UUID
X.500CN=John Doe,O=CompanyDistinguished Name na UUID

Důležité vlastnosti:

  • Deterministické: Stejný vstup = vždy stejné UUID
  • Reprodukovatelné: Můžete UUID znovu vytvořit kdykoliv
  • Konzistentní: Stejné UUID napříč různými systémy
  • Nelze dekódovat: Z UUID nelze získat zpět původní název
  • ℹ️ Jedno UUID: Pro v3/v5 se generuje vždy pouze jedno UUID (stejný vstup = stejný výstup)

Praktické použití:

// Příklad: Převod URL na UUID v5
Namespace: URL
Název: https://example.com/api/users/123
Výsledek: 886313e1-3b8a-5372-9b90-0c9aee199e5d

// Stejný vstup = vždy stejné UUID
Namespace: DNS
Název: google.com
Výsledek: vždy stejné UUID pro google.com

Jak bezpečně používat UUID?

Kryptografická bezpečnost

Náš generátor používá crypto.getRandomValues(), což je kryptograficky bezpečný generátor náhodných čísel. Na rozdíl od Math.random(), který je předvídatelný a nevhodný pro bezpečnostní účely, crypto.getRandomValues() poskytuje skutečnou entropii vhodnou pro:

  • Generování bezpečnostních tokenů
  • Session IDs
  • API klíče
  • Kryptografické aplikace

Srovnání verzí UUID

VerzeZákladKolizeČasové řazeníDB výkonPoužití
v1Timestamp + MACNízká✅ Ano❌ HoršíLegacy, audit
v3MD5 hashŽádná (deterministické)❌ Ne⚠️ StředníPřevody (legacy)
v4NáhodnéExtrémně nízká❌ Ne⚠️ StředníObecné použití
v5SHA-1 hashŽádná (deterministické)❌ Ne⚠️ StředníPřevody (doporučeno)
v6Seřazený timestampNízká✅ Ano✅ LepšíModerní DB s časem
v7Unix timestampNízká✅ Ano✅ NejlepšíNové projekty

UUID vs jiné identifikátory

TypVelikostKolizeČasové řazeníPoužití
Auto-increment ID4-8 bytůGarantovaně unikátní v rámci tabulkyJednoduché aplikace, lokální DB
UUID v416 bytůPrakticky nemožnáDistribuované systémy, API
UUID v716 bytůPrakticky nemožnáModerní DB s výkonem
ULID16 bytůPrakticky nemožnáUUID + lexicografické řazení
Snowflake ID8 bytůGarantovaně unikátní při správné konfiguraciTwitter, distribuované systémy
NanoIDKonfigurovatelnáZávisí na délceURL-friendly IDs

Implementace v různých jazycích

JavaScript/TypeScript

// UUID v4 - Nejjednodušší způsob (moderní prohlížeče)
const uuid = crypto.randomUUID();

// UUID v4 - Manuální implementace
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 - Doporučeno pro databáze
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())
# Output: '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();

Best Practices

Ukládání UUID v databázi

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
);

Tip: V MySQL ukládejte UUID jako BINARY(16) místo CHAR(36) pro úsporu místa a rychlejší indexování.

Validace 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);
}

Konverze UUID

// Odstranění pomlček
const compact = uuid.replace(/-/g, '');

// Přidání pomlček zpět
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('-');
}

Řešení problémů (Troubleshooting)

UUID v3/v5 nefunguje

Problém: Po výběru v3 nebo v5 se nic negeneruje

Řešení:

  1. ✅ Zkontrolujte, že jste vyplnili pole “Název” - je povinné!
  2. ✅ Vyberte správný namespace podle typu vašeho vstupu
  3. ✅ Příklady platných vstupů:
    • DNS: example.com, google.com
    • URL: https://example.com/page
    • Jakýkoliv text: moje-aplikace-v1

Tip: Zkuste nejdřív jednoduchou hodnotu jako test a namespace DNS.

Časové UUID (v1, v6, v7) má divný čas

Problém: Vygenerované UUID má neočekávaný timestamp

Řešení:

  1. ✅ Zkontrolujte date-time picker - je nastaven správný čas?
  2. ✅ Date-time picker používá váš lokální časovou zónu
  3. ✅ Nechte date-time picker prázdný pro aktuální čas

UUID se nedá zkopírovat

Problém: Tlačítko “Kopírovat vše” nefunguje

Řešení:

  1. ✅ Zkontrolujte, že jste vygenerovali UUID (nejsou prázdné)
  2. ✅ Některé prohlížeče vyžadují HTTPS pro clipboard API
  3. ✅ Alternativně vyberte text v textarea a zkopírujte ručně (Ctrl+C)

Časté otázky (FAQ)

Může dojít ke kolizi UUID? Teoreticky ano, ale pravděpodobnost je astronomicky malá. Při generování 1 miliardy UUID v4 za sekundu po dobu 100 let je šance na kolizi přibližně 0,00000006%. V praxi se kolize nikdy nestane.
Je UUID vhodné jako primární klíč v databázi? Záleží na use case. UUID je ideální pro distribuované systémy a situace, kdy potřebujete globální unikátnost. Pro jednoduché aplikace s jednou databází může být auto-increment efektivnější.
Jsou UUID vygenerovaná tímto nástrojem bezpečná? Ano, používáme Web Crypto API (`crypto.getRandomValues()`), které poskytuje kryptograficky bezpečné náhodné hodnoty. Vše probíhá lokálně ve vašem prohlížeči.
Jaký je rozdíl mezi verzemi UUID? - **v1**: Časové razítko + MAC/náhodné - chronologické řazení, horší DB výkon - **v3/v5**: Hash-based - deterministické, pro převody známých identifikátorů - **v4**: Náhodné - nejbezpečnější, nejpoužívanější - **v6**: Přeuspořádané časové razítko - lepší DB výkon než v1 - **v7**: Unix timestamp - nejlepší DB výkon + časové řazení
Kterou verzi UUID bych měl použít? Pro většinu případů použijte **v4** (náhodné). Pro databáze s časovým řazením použijte **v7** (moderní) nebo **v6** (standard). Pro převody známých identifikátorů (URL, DNS) použijte **v5** (SHA-1).
Můžu použít UUID pro tokeny a API klíče? UUID v4 je vhodné pro session IDs a podobné tokeny. Pro API klíče zvažte použití delších náhodných stringů (např. 256-bit hodnoty) nebo specializovaných knihoven.
Jak velké jsou UUID? UUID má 128 bitů (16 bytů). Ve formátu string s pomlčkami zabere 36 znaků. Bez pomlček 32 hexadecimálních znaků.

Alternativy k UUID

ULID (Universally Unique Lexicographically Sortable Identifier)

  • 128-bitové ID (stejně jako UUID)
  • Lexicograficky seřaditelné podle času vytvoření
  • Kompaktnější reprezentace (26 znaků místo 36)
  • Case-insensitive base32 encoding

Příklad: 01ARZ3NDEKTSV4RRFFQ69G5FAV

NanoID

  • Menší velikost než UUID (21 znaků standardně)
  • URL-friendly (bez speciálních znaků)
  • Rychlejší generování
  • Konfigurovatelná délka a abeceda

Příklad: V1StGXR8_Z5jdHi6B-myT

Snowflake ID (Twitter)

  • 64-bitové ID (menší než UUID)
  • Časově seřaditelné
  • Obsahuje worker ID a sequence number
  • Vyžaduje centralizovanou konfiguraci

Příklad: 1234567890123456789

Výkon a optimalizace

Rychlost generování

Náš generátor dokáže vygenerovat:

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

Tipy pro výkon

  1. Batch generování – Pokud potřebujete mnoho UUID, generujte je najednou místo po jednom
  2. Ukládání v DB – Indexujte UUID sloupce pro rychlé vyhledávání
  3. Komprese – Ukládejte UUID v binární podobě (16 bytů) místo stringu (36 bytů)
  4. Caching – V některých případech můžete UUID předgenerovat a cachovat

Pro vývojáře

Struktura UUID v4

xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
|        |    |    |    |
|        |    |    |    └─ 48 bitů náhodných dat (node)
|        |    |    └────── 16 bitů náhodných dat s variantou (clock_seq)
|        |    └─────────── 12 bitů náhodných dat + 4 bity verze (time_hi_and_version)
|        └──────────────── 16 bitů náhodných dat (time_mid)
└───────────────────────── 32 bitů náhodných dat (time_low)
  • Verze (4 bity): vždy 0100 (binárně) = 4 (hex)
  • Varianta (2-3 bity): vždy 10 (binárně) pro RFC 4122

Testování UUID

// Jest test
describe('UUID Generator', () => {
  test('generates valid 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('generates unique UUIDs', () => {
    const uuid1 = generateUUIDv4();
    const uuid2 = generateUUIDv4();
    expect(uuid1).not.toBe(uuid2);
  });
});

Bezpečnostní aspekty

Co nedělat s UUID

Nepoužívejte UUID v1 pro citlivé aplikace – Obsahuje časové razítko, což může být bezpečnostní riziko

Nepoužívejte Math.random() pro generování UUID – Není kryptograficky bezpečné

Nespoléhejte se na UUID pro autorizaci – UUID lze uhádnout (i když s extrémně malou pravděpodobností)

Neukládejte UUID v cookies bez šifrování – Použijte signed cookies nebo JWT

Co dělat

Používejte UUID v4 pro většinu případů – Nejvyšší entropie a bezpečnost

Kombinujte UUID s dalšími bezpečnostními opatřeními – Pro session management použijte HTTPS, HttpOnly cookies, a krátkou expiraci

Validujte UUID na serveru – Vždy kontrolujte formát a verzi UUID

Používejte kryptograficky bezpečné zdroje náhodnosticrypto.getRandomValues() v prohlížeči, /dev/urandom na Linuxu

Zajímavosti

  • Počet možných UUID v4: 2^122 ≈ 5.3 × 10^36 (340 undecilionů)
  • Potřebná kolize: K 50% šanci na kolizi musíte vygenerovat 2.71 × 10^18 UUID (2.71 quintilionů)
  • Velikost všech možných UUID: Kdybychom každé UUID uložili jako 16 bytů, zabral by celý prostor 85 zettabytů (85 miliard terabytů)
  • Původ: UUID byl standardizován jako součást DCE (Distributed Computing Environment) v roce 1990