UUID v4 Generator

Generate cryptographically random UUID v4

Formátovat

Počet:

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:

550e8400-e29b-41d4-a716-446655440000

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:

SegmentBityVýznam
550e840032 náhodnýchtime_low (historický název — plně náhodné ve v4)
e29b16 náhodnýchtime_mid (historický název — plně náhodné ve v4)
41d44 pevné + 12 náhodnýchVerze nibble 4 (binárně 0100) + 12 náhodných bitů
a7162 pevné + 14 náhodnýchVariantní bity 10 (MSB prvního bajtu) + 14 náhodných bitů
44665544000048 náhodnýchnode (plně náhodné ve v4)
Note:Variantní nibble na začátku čtvrté skupiny je vždy jedním z 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:

UUID v1Časové razítko + MAC

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í.

UUID v3MD5 hash

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.

UUID v4Náhodné

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.

UUID v5SHA-1 hash

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

UUID v7Časově uspořádané náhodné

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.

Note:Pokud váš případ použití vyžaduje seřaditelná ID (např. chcete, aby se databázové řádky seskupovaly podle času vložení), zvažte místo toho UUID v7. UUID v4 je záměrně náhodné a při vysokých rychlostech vkládání způsobí fragmentaci indexu v B-tree indexech.

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:

Vygenerovaná UUIDPravděpodobnost kolize
1 miliarda (109)~1 z 5,3 × 1018
1 bilion (1012)~1 z 5,3 × 1012
1018 (1 exabajt)~1 z 5 300

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.

js
// 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)

js
const { v4: uuidv4 } = require('uuid')

const id = uuidv4()
// → "110e8400-e29b-41d4-a716-446655440000"

Python

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

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

toml
# Cargo.toml
[dependencies]
uuid = { version = "1", features = ["v4"] }
rust
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.

js
const id = crypto.randomUUID()              // "550e8400-e29b-41d4-a716-446655440000"
const compact = id.replaceAll('-', '')     // "550e8400e29b41d4a716446655440000"