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í:
- Vyberte verzi v1, v6 nebo v7
- Nastavte datum a čas pomocí date-time pickeru
- 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:
- Vyberte namespace podle typu vašeho identifikátoru
- Zadejte název/hodnotu
- Vygenerujte UUID
Příklady:
| Namespace | Název (vstup) | Použití |
|---|---|---|
| DNS | example.com | Převod doménového jména na UUID |
| DNS | google.com | Každý web má unikátní UUID |
| URL | https://example.com/page | Převod URL na UUID |
| URL | https://api.example.com/users/123 | API endpoint jako UUID |
| OID | 1.3.6.1.4.1.343 | Object Identifier na UUID |
| X.500 | CN=John Doe,O=Company | Distinguished 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
| Verze | Základ | Kolize | Časové řazení | DB výkon | Použití |
|---|---|---|---|---|---|
| v1 | Timestamp + MAC | Nízká | ✅ Ano | ❌ Horší | Legacy, audit |
| v3 | MD5 hash | Žádná (deterministické) | ❌ Ne | ⚠️ Střední | Převody (legacy) |
| v4 | Náhodné | Extrémně nízká | ❌ Ne | ⚠️ Střední | Obecné použití |
| v5 | SHA-1 hash | Žádná (deterministické) | ❌ Ne | ⚠️ Střední | Převody (doporučeno) |
| v6 | Seřazený timestamp | Nízká | ✅ Ano | ✅ Lepší | Moderní DB s časem |
| v7 | Unix timestamp | Nízká | ✅ Ano | ✅ Nejlepší | Nové projekty |
UUID vs jiné identifikátory
| Typ | Velikost | Kolize | Časové řazení | Použití |
|---|---|---|---|---|
| Auto-increment ID | 4-8 bytů | Garantovaně unikátní v rámci tabulky | ❌ | Jednoduché aplikace, lokální DB |
| UUID v4 | 16 bytů | Prakticky nemožná | ❌ | Distribuované systémy, API |
| UUID v7 | 16 bytů | Prakticky nemožná | ✅ | Moderní DB s výkonem |
| ULID | 16 bytů | Prakticky nemožná | ✅ | UUID + lexicografické řazení |
| Snowflake ID | 8 bytů | Garantovaně unikátní při správné konfiguraci | ✅ | Twitter, distribuované systémy |
| NanoID | Konfigurovatelná | Závisí na délce | ❌ | URL-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í:
- ✅ Zkontrolujte, že jste vyplnili pole “Název” - je povinné!
- ✅ Vyberte správný namespace podle typu vašeho vstupu
- ✅ Příklady platných vstupů:
- DNS:
example.com,google.com - URL:
https://example.com/page - Jakýkoliv text:
moje-aplikace-v1
- DNS:
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í:
- ✅ Zkontrolujte date-time picker - je nastaven správný čas?
- ✅ Date-time picker používá váš lokální časovou zónu
- ✅ 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í:
- ✅ Zkontrolujte, že jste vygenerovali UUID (nejsou prázdné)
- ✅ Některé prohlížeče vyžadují HTTPS pro clipboard API
- ✅ 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
- Batch generování – Pokud potřebujete mnoho UUID, generujte je najednou místo po jednom
- Ukládání v DB – Indexujte UUID sloupce pro rychlé vyhledávání
- Komprese – Ukládejte UUID v binární podobě (16 bytů) místo stringu (36 bytů)
- 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áhodnosti – crypto.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