UUID v4 Generator
Generate cryptographically random UUID v4
…
Formátovat
UUID v4 je nejrozšířenější verzí UUID v moderním softwaru. Na rozdíl od svých sourozenců, kteří odvozují bity z časového razítka nebo hash jmenného prostoru, je UUID v4 postaven výhradně z náhodných dat — což z něj činí nejjednodušší a nejpřenositelnější volbu, kdykoliv potřebujete jedinečný identifikátor bez metadat o původu.
Tento generátor používá crypto.randomUUID(), nativní API prohlížeče a Node.js, které čerpá entropii z kryptograficky bezpečného generátoru náhodných čísel operačního systému — stejného zdroje používaného pro materiál klíče TLS.
Co je UUID v4?
Universally Unique Identifier (UUID) je 128bitový štítek standardizovaný v RFC 4122. Obvykle je reprezentován jako 32 hexadecimálních číslic seskupených pomlčkami do vzoru 8-4-4-4-12:
V UUID v4 je 122 ze 128 bitů náhodných. Zbývajících 6 bitů jsou pevná pole vyžadovaná specifikací: 4 bity kódují verzi (0100 = 4) a 2 bity kódují variantu RFC 4122 (10). Tato pevná pole jsou důvodem, proč třetí skupina vždy začíná 4 a čtvrtá skupina vždy začíná 8, 9, a nebo b.
Anatomie UUID v4
Rozklad 550e8400-e29b-41d4-a716-446655440000:
| Segment | Bity | Význam |
|---|---|---|
| 550e8400 | 32 náhodných | time_low (historický název — plně náhodné ve v4) |
| e29b | 16 náhodných | time_mid (historický název — plně náhodné ve v4) |
| 41d4 | 4 pevné + 12 náhodných | Verze nibble 4 (binárně 0100) + 12 náhodných bitů |
| a716 | 2 pevné + 14 náhodných | Variantní bity 10 (MSB prvního bajtu) + 14 náhodných bitů |
| 446655440000 | 48 náhodných | node (plně náhodné ve v4) |
8, 9, a nebo b — protože vysoké dva bity tohoto bajtu jsou pevně nastaveny na 10 (značka varianty RFC 4122), přičemž zbývající dva bity mohou volně variovat.UUID v4 vs jiné verze
RFC 4122 definuje pět verzí UUID. Každá řeší jiný problém:
Kombinuje 60bitové časové razítko (intervaly 100 nanosekund od října 1582) s MAC adresou hostitele. Monotónně rostoucí v rámci jednoho stroje.
Use when: potřebujete časově uspořádaná ID a nevadí vám prozradit identitu serveru a čas generování.
Deterministické: stejný jmenný prostor + název vždy vytvoří stejné UUID. Používá hashování MD5.
Use when: potřebujete reprodukovatelná ID ze známého jmenného prostoru (např. DNS jména). Preferujte v5 před v3.
122 bitů kryptograficky bezpečné náhodnosti. Bez časového razítka, bez MAC, bez jmenného prostoru. Nejběžnější volba pro obecné účely.
Use when: potřebujete jedinečná ID bez strukturálního významu a s maximálním soukromím.
Jako v3, ale používá SHA-1. Stále deterministické ze jmenného prostoru + názvu.
Use when: potřebujete reprodukovatelné, obsahem adresované identifikátory (např. stabilní ID pro zdroje identifikované pomocí URL).
Novější (RFC 9562, 2024). Kóduje Unix millisekudové časové razítko ve vysokých bitech, pak náhodné bity. Seřaditelné a databázově přívětivé.
Use when: potřebujete databázově indexově přívětivá ID s přirozeným časovým uspořádáním (preferujte před v1 pro nové projekty).
Kdy použít UUID v4
UUID v4 je správný nástroj v naprosté většině situací, kdy jednoduše potřebujete 'jedinečné ID' bez dalších omezení:
ID uživatelů a účtů
Neprůhledná ID uživatelů, která neprozrazují nic o čase vytvoření účtu ani identitě serveru. Nelze je vyjmenovat ani uhodnout.
Primární klíče databáze
Funguje s jakýmkoliv databázovým strojem. UUID v4 je bezpečné generovat na straně klienta a slučovat z distribuovaných zdrojů bez koordinace — není potřeba sekvenční tabulka ani centrální ID služba.
ID relací a tokenů
122 bitů náhodnosti činí hrubou silou hádání výpočetně nemožné — srovnatelnou silou s 122bitovým náhodným tokenem.
Názvy souborů a objektů
Názvy souborů bezpečné proti duplikaci pro nahrávky, klíče objektů S3 nebo položky mezipaměti. Žádné riziko, že dva klienti zapíší do stejného klíče.
Klíče idempotence
Vygenerujte UUID na klientovi před odesláním požadavku. Server může bezpečně deduplikovat opakované požadavky bez sdíleného čítače.
ID korelace a sledování
Připojte UUID ke každému řádku protokolu a rozsahu distribuovaného sledování. Není potřeba koordinace mezi službami nebo stroji.
Pravděpodobnost kolize
S 122 náhodnými bity obsahuje prostor UUID v4 2122 ≈ 5,3 × 1036 možných hodnot. Pravděpodobnost kolize sleduje problém narozenin:
Běžně citovaný benchmark: abyste měli 50% šanci na jednu kolizi, museli byste vygenerovat přibližně 2,71 × 1018 UUID. Při rychlosti 1 miliardy UUID za sekundu by to trvalo přibližně 85 let nepřetržitého generování. Pro jakoukoli reálnou aplikaci nejsou kolize praktickým problémem.
Příklady kódu
JavaScript — Prohlížeč a Node.js 14.17+
Metoda crypto.randomUUID() je nativně dostupná ve všech moderních prohlížečích (Chrome 92+, Firefox 95+, Safari 15.4+) a v Node.js 14.17+. Není potřeba žádná instalace balíčku.
// Browser or Node.js 14.17+
const id = crypto.randomUUID()
// → "110e8400-e29b-41d4-a716-446655440000"
// Generate multiple
const ids = Array.from({ length: 5 }, () => crypto.randomUUID())Node.js — starší verze (balíček uuid)
const { v4: uuidv4 } = require('uuid')
const id = uuidv4()
// → "110e8400-e29b-41d4-a716-446655440000"Python
import uuid # Generate a UUID v4 id = str(uuid.uuid4()) # → '110e8400-e29b-41d4-a716-446655440000' # The uuid module uses os.urandom() — cryptographically secure print(uuid.uuid4().hex) # without hyphens # → '110e8400e29b41d4a716446655440000'
Go
import "github.com/google/uuid" id := uuid.New().String() // → "110e8400-e29b-41d4-a716-446655440000" // Or using the standard library (Go 1.20+ with math/rand/v2 is NOT cryptographic) // Always prefer github.com/google/uuid for production use
Rust
# Cargo.toml
[dependencies]
uuid = { version = "1", features = ["v4"] }use uuid::Uuid; let id = Uuid::new_v4().to_string(); // → "110e8400-e29b-41d4-a716-446655440000"
Časté dotazy
Je UUID v4 kryptograficky bezpečné?
UUID v4 samotné není bezpečnostním primitivem — je to formát identifikátoru. Avšak při generování přes crypto.randomUUID() (prohlížeč nebo Node.js) nebo ekvivalentní API na úrovni OS je základní entropie kryptograficky bezpečná. To znamená, že hodnoty UUID v4 jsou vhodné pro použití jako tokeny relací nebo klíče idempotence, kde záleží na nepředvídatelnosti. Nepoužívejte generátory UUID založené na Math.random() pro bezpečnostně citlivé kontexty — používejte pouze API, která explicitně čerpají z OS CSPRNG.
Mohou být dvě UUID v4 někdy stejná?
Teoreticky ano, ale prakticky ne. Pravděpodobnost vygenerování duplikátu v jakémkoliv realistickém datovém souboru (miliardy ID) je astronomicky malá — mnohem méně pravděpodobná než hardwarová závada způsobující poškození dat. Kolize UUID v4 je v návrhu produkčního systému považována za nemožnou. Pokud skutečně potřebujete záruku nulové kolize, použijte centralizovaný čítač nebo databázovou sekvenci.
UUID v4 vs nanoid — který mám použít?
Oba jsou generátory náhodných ID podporované CSPRNG. Klíčové rozdíly:
- UUID v4 sleduje standard RFC 4122, je rozpoznáván každou databází a frameworkem a nevyžaduje žádné závislosti (nativní
crypto.randomUUID()). - nanoid používá URL-bezpečnou abecedu a je výchozně kratší (21 znaků vs 36). Užitečné, když záleží na délce URL nebo čitelnosti. Vyžaduje balíček npm.
Preferujte UUID v4, když záleží na interoperabilitě s externími systémy (API, databáze, logovací infrastruktura). Preferujte nanoid, když chcete kratší ID a ovládáte celý stack.
Mám ukládat UUID jako řetězce nebo binárně v databázích?
Pro většinu databází je ukládání jako sloupec UUID nebo BINARY(16) (16 bajtů) efektivnější než řetězec VARCHAR(36) (36 bajtů). PostgreSQL má nativní typ uuid. MySQL a MariaDB fungují dobře s BINARY(16) a pomocnými funkcemi UUID_TO_BIN() / BIN_TO_UUID(). Uživatelé SQLite obvykle ukládají jako TEXT. Volba úložiště nemá vliv na jedinečnost ani správnost.
Proč má UUID v4 pomlčky — a mohu je vynechat?
Pomlčky jsou součástí kanonické reprezentace UUID definované RFC 4122. Jsou čistě kosmetické — nenese žádnou informaci a neovlivňují 128bitovou hodnotu. Jejich vynecháním získáte kompaktní 32znakový hex řetězec, který je funkčně ekvivalentní. Většina parserů UUID přijímá oba formáty. V případě pochybností použijte kanonický formát s pomlčkami pro maximální kompatibilitu s nástroji a databázemi třetích stran.
const id = crypto.randomUUID() // "550e8400-e29b-41d4-a716-446655440000"
const compact = id.replaceAll('-', '') // "550e8400e29b41d4a716446655440000"