UUID v4 v JavaScriptu — generování a validace

·TypeScript & Full-stack Developer·ZkontrolovánoMarcus Webb·Publikováno

Používejte bezplatný UUID v4 Generator přímo v prohlížeči — bez instalace.

Vyzkoušet UUID v4 Generator online →

Každá JavaScriptová aplikace dříve nebo později potřebuje jedinečné identifikátory — session tokeny, řádky databáze, idempotency klíče pro platební API, correlation ID pro distribuované trasování. Nejjednodušší způsob, jak generovat UUID v4 v JavaScriptu dnes, je crypto.randomUUID(): žádné závislosti, jeden řádek, kryptograficky bezpečné. UUID v4 je hojně využíváno právě proto, že nepotřebuje koordinaci mezi službami — klient i server mohou generovat ID nezávisle bez rizika kolize. Tento průvodce pokrývá toto vestavěné API, balíček uuid pro npm, validaci — vše na Node.js 19+ a moderních prohlížečích. Pro možnost bez kódu generuje UUID v4 Generator na ToolDeck kompatibilní identifikátory okamžitě.

  • crypto.randomUUID() je vestavěné v prohlížečích i Node.js — žádné závislosti, jeden řádek kódu.
  • UUID v4 je 128bitový náhodný identifikátor: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx (y je 8, 9, a nebo b).
  • Validujte pomocí /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i — kontroluje bity verze a varianty.
  • Balíček uuid pro npm přidává podporu v1, v3, v5 a v7, když potřebujete více než náhodná ID.
  • Pro primární klíče databází preferujte UUID v7 (časově řazené) před v4 (náhodným) kvůli snížení fragmentace indexu.

Co je UUID v4?

UUID (Universally Unique Identifier) verze 4 je 128bitový náhodný identifikátor formátovaný jako 32 hexadecimálních číslic oddělených čtyřmi pomlčkami: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx. Znak 4 na pozici 15 označuje verzi. Znak y na pozici 20 je jeden z 8, 9, a nebo b (varianta RFC 4122). Zbývajících 122 bitů je náhodných. UUID v4 je nejčastější verzí v JavaScriptových aplikacích, protože nevyžaduje koordinaci mezi systémy — ID lze generovat nezávisle na klientovi i serveru bez obav z kolizí.

Before · javascript
After · javascript
// Bez identifikátoru
const event = { action: "user.login", ts: 1711824000 };
// S UUID v4
const event = {
  id: "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
  action: "user.login",
  ts: 1711824000
};

crypto.randomUUID() — Nativní přístup v JavaScriptu

crypto.randomUUID() je dostupné v Chrome 92+, Firefox 95+, Safari 15.4+ a Node.js 19+ (s experimentální podporou od Node.js 14.17.0 přes globalThis.crypto). Vrátí 36znakový řetězec UUID v4 malými písmeny. V prohlížečovém JavaScriptu není potřeba žádný import. V Node.js ho lze volat přímo na globálním objektu cryptonebo ho explicitně importovat z modulu node:crypto.

JavaScript — prohlížeč (bez importů)
// Funguje v jakémkoliv moderním prohlížeči — žádný build krok, žádný bundler
const requestId = crypto.randomUUID();
console.log(requestId);
// "3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f"

// Použijte kdekoliv potřebujete jedinečný identifikátor
const telemetryEvent = {
  event_id: crypto.randomUUID(),
  action: "checkout.started",
  session_id: crypto.randomUUID(),
  timestamp: Date.now(),
  cart_total_cents: 14999,
};
console.log(JSON.stringify(telemetryEvent, null, 2));
Node.js — dva ekvivalentní přístupy
// Přístup 1: globální crypto (Node.js 19+)
const orderId = crypto.randomUUID();
console.log(orderId);
// "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d"

// Přístup 2: explicitní import z node:crypto
import { randomUUID } from 'node:crypto';
const correlationId = randomUUID();
console.log(correlationId);
// "f7e6d5c4-b3a2-4190-8f7e-6d5c4b3a2190"

Detekce funkce crypto.randomUUID se vyplatí, pokud váš kód může běžet ve starších prohlížečích nebo embedded WebViews. Kontrola je jednoduchý typeof guard:

JavaScript — detekce funkce s fallbackem
function generateUUIDv4() {
  // Preferujte nativní API, pokud je dostupné
  if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
    return crypto.randomUUID();
  }

  // Ruční fallback pomocí getRandomValues (viz další sekce)
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);

  // Nastavit verzi (4) a variantu (RFC 4122)
  bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4
  bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 10xx

  const hex = [...bytes].map(b => b.toString(16).padStart(2, '0'));
  return [
    hex.slice(0, 4).join(''),
    hex.slice(4, 6).join(''),
    hex.slice(6, 8).join(''),
    hex.slice(8, 10).join(''),
    hex.slice(10, 16).join(''),
  ].join('-');
}

console.log(generateUUIDv4());
// "9b2e4f1a-7c3d-4e8f-a5b6-0d2c1e9f8a7b"
Poznámka:V bezpečných kontextech (HTTPS stránky, localhost, rozšíření prohlížeče) je crypto.randomUUID() vždy dostupné. V některých prohlížečích vyhodí výjimku na nezabezpečených HTTP stránkách. Pokud vaše aplikace někdy běží na HTTP během vývoje, výše uvedený fallback pomocí getRandomValues tento případ ošetří.

Generování UUID v4 bez knihovny

Někdy se nelze spoléhat na crypto.randomUUID() — možná cílíte na WebView, který odstraňuje crypto API, nebo chcete pochopit, co se děje pod kapotou. Ruční přístup používá crypto.getRandomValues() (dostupné od IE 11) k naplnění 16 bajtů náhodnými daty, poté aplikuje dvě bitmaskovací operace pro nastavení polí verze a varianty. Tyto dvě operace jsou jediným rozdílem mezi UUID v4 a čistým náhodným bajtovým řetězcem.

JavaScript — ruční UUID v4 s getRandomValues
function uuidv4Manual() {
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);

  // Set version: bits 12–15 of byte 6 = 0100 (version 4)
  bytes[6] = (bytes[6] & 0x0f) | 0x40;

  // Set variant: bits 6–7 of byte 8 = 10 (RFC 4122)
  bytes[8] = (bytes[8] & 0x3f) | 0x80;

  const hex = [...bytes].map(b => b.toString(16).padStart(2, '0'));

  return (
    hex.slice(0, 4).join('') + '-' +
    hex.slice(4, 6).join('') + '-' +
    hex.slice(6, 8).join('') + '-' +
    hex.slice(8, 10).join('') + '-' +
    hex.slice(10, 16).join('')
  );
}

const traceId = uuidv4Manual();
console.log(traceId);
// "e4d7c2a1-3f9b-48e5-a612-9d8c7b6a5f4e"

// Verify it passes UUID v4 validation
const UUID_V4_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
console.log(UUID_V4_RE.test(traceId)); // true
Varování:Nikdy nepoužívejte Math.random() ke generování UUID. Není kryptograficky bezpečné, jeho výstupní perioda je příliš krátká a některé enginy produkují předvídatelné sekvence. Vždy používejte crypto.getRandomValues() nebo crypto.randomUUID().

Balíček uuid pro npm — podpora více verzí

Balíček uuid na npm byl hlavní UUID knihovnou pro JavaScript ještě před tím, než crypto.randomUUID() existovalo. Stále má smysl ve třech situacích: potřebujete jiné verze UUID než v4 (v1, v3, v5, v7), cílíte na runtime starší než Node.js 14.17.0, nebo chcete utility funkce validate a parse. Pro čisté UUID v4 na moderním runtime stačí nativní API a tuto závislost bych přeskočil.

bash — instalace
npm install uuid
JavaScript — balíček uuid pro generování v4
import { v4 as uuidv4, validate, version } from 'uuid';

// Generate a UUID v4
const paymentId = uuidv4();
console.log(paymentId);
// "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed"

// Validate any UUID string
console.log(validate(paymentId));    // true
console.log(validate("not-a-uuid")); // false

// Detect the version of a UUID
console.log(version(paymentId));     // 4

// Generate a batch for seeding a test database
const testAccounts = Array.from({ length: 5 }, () => ({
  account_id: uuidv4(),
  plan: "starter",
  created_at: new Date().toISOString(),
}));
console.log(testAccounts);
Poznámka:Balíček uuid interně používá crypto.getRandomValues() v prohlížečích a crypto.randomBytes() v Node.js, takže zdroj entropie je identický s nativním API. Rozdíl jsou jen dodatečné utility funkce a podpora více verzí.

Pokud raději nechcete psát kód vůbec, vyzkoušejte UUID v4 Generator — generuje RFC 4122-kompatibilní identifikátory v4 přímo ve vašem prohlížeči jedním kliknutím.

Deterministická UUID — generování UUID v5 z řetězce

UUID v4 je ze své podstaty náhodné — dvě volání vždy vrátí různé výsledky. Někdy potřebujete opak: stejný vstupní řetězec by měl vždy produkovat stejné UUID. Přesně to dělá UUID v5. Zahashuje namespace UUID a vstupní řetězec pomocí SHA-1 a výsledek naformátuje jako UUID. Stejný namespace + stejný vstup = stejný výstup, pokaždé, na každém stroji. To se hodí pro odvozování stabilních ID z URL, e-mailových adres nebo jakéhokoliv řetězce, který již identifikuje zdroj.

JavaScript — uuid v5 pro deterministická ID
import { v5 as uuidv5 } from 'uuid';

// Built-in namespace for URLs (RFC 4122)
const URL_NAMESPACE = uuidv5.URL;
// "6ba7b811-9dad-11d1-80b4-00c04fd430c8"

// Same URL always produces the same UUID
const pageId1 = uuidv5("https://api.warehouse.dev/products/sku-7291", URL_NAMESPACE);
const pageId2 = uuidv5("https://api.warehouse.dev/products/sku-7291", URL_NAMESPACE);
console.log(pageId1 === pageId2); // true
console.log(pageId1);
// "a6e4e1c0-7e23-5d3b-8f14-9c2a1b3d5e7f"

// Custom namespace for your application
const APP_NAMESPACE = "f47ac10b-58cc-4372-a567-0e02b2c3d479";
const tenantId = uuidv5("acme-corp", APP_NAMESPACE);
console.log(tenantId);
// "d4735e3a-265b-564e-8f32-7a1b2c3d4e5f"

Krátká poznámka: UUID v3 dělá totéž, ale s MD5 místo SHA-1. Pro nové projekty preferujte v5. MD5 má známé slabiny při kolizích a ačkoliv to pro generování ID příliš nezáleží, není důvod volit MD5 před SHA-1, když jsou obě dostupné.

Přehled crypto.randomUUID() a souvisejících API

Nativní crypto.randomUUID() nepřijímá žádné argumenty — vrátí řetězec a nic jiného. Použijte ho, když potřebujete RFC 4122 kompatibilní identifikátory bez závislostí. Pokud potřebujete surové náhodné bajty místo formátovaného UUID řetězce — například pro naplnění typovaného pole nebo odvození klíče — sáhněte přímo po crypto.getRandomValues(). Příbuzná API relevantní pro práci s UUID jsou uvedena níže.

Vlastnost / Metoda
Návratový typ
Popis
crypto.randomUUID()
string
Vrátí 36znakový řetězec UUID v4 v malých hexadecimálních písmenech s pomlčkami
crypto.getRandomValues(arr)
TypedArray
Naplní typované pole kryptograficky náhodnými hodnotami — základ pro ruční generování UUID
URL.createObjectURL(blob)
string
Generuje jedinečnou blob URL (není to UUID, ale někdy se s ním zaměňuje)

Rozbor vzoru regulárního výrazu pro UUID v4:

Segment
Vzor
Význam
[0-9a-f]{8}
xxxxxxxx
Prvních 8 hex číslic — 32 náhodných bitů
[0-9a-f]{4}
xxxx
Dalších 4 hex číslice — 16 náhodných bitů
4[0-9a-f]{3}
4xxx
Nibble verze fixován na 4, následováno 12 náhodnými bity
[89ab][0-9a-f]{3}
yxxx
Nibble varianty je jedna z hodnot 8, 9, a, b — následována 12 náhodnými bity
[0-9a-f]{12}
xxxxxxxxxxxx
Posledních 12 hex číslic — 48 náhodných bitů

Validace UUID v4 pomocí regulárního výrazu

Validace, zda je řetězec správným UUID v4, se vyskytuje neustále — těla příchozích API požadavků, URL parametry, webhook payloady. Ručně vytvořený regulární výraz je správná volba, když chcete nulové závislosti a validujete pouze v4. Pokud již používáte balíček uuid, preferujte jeho export validate() — zpracovává všechny verze UUID a je méně náchylný k chybám než udržování vlastního vzoru. Regulární výraz /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i kontroluje nibble verze (musí být 4) i nibble varianty (musí být 8, 9, a nebo b). Použijte RegExp.prototype.test() pro boolean kontroly a .match() když potřebujete extrahovat UUID z okolního textu.

JavaScript — pomocná funkce pro validaci UUID v4
const UUID_V4_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;

function isUUIDv4(str) {
  return UUID_V4_RE.test(str);
}

// Valid UUID v4
console.log(isUUIDv4("9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d")); // true

// UUID v1 — version nibble is 1, not 4
console.log(isUUIDv4("550e8400-e29b-11d4-a716-446655440000")); // false

// UUID v7 — version nibble is 7
console.log(isUUIDv4("018e4a0c-5b3f-7d12-8a9b-0c1d2e3f4a5b")); // false

// Malformed strings
console.log(isUUIDv4("not-a-uuid"));           // false
console.log(isUUIDv4(""));                      // false
console.log(isUUIDv4("9b1deb4d3b7d4bad9bdd2b0d7b3dcb6d")); // false (no hyphens)

// Extract UUID from a larger string
const logLine = 'Request req_id=9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d failed with 503';
const match = logLine.match(/[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i);
console.log(match?.[0]);
// "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"

Generování a přiřazování UUID ze souboru a API odpovědi

V praxi voláte crypto.randomUUID() zřídkakdy izolovaně. Neustále se opakují dva vzory: přiřazování ID záznamům před jejich zápisem do databáze a připojování correlation ID k odchozím API požadavkům, abyste mohli sledovat požadavek napříč službami v logu.

Čtení NDJSON souboru → Přiřazení UUID → Zápis zpět

Node.js — přiřazení UUID záznamům ze souboru
import { readFileSync, writeFileSync } from 'node:fs';
import { randomUUID } from 'node:crypto';

function assignIds(inputPath, outputPath) {
  const lines = readFileSync(inputPath, 'utf-8')
    .split('\n')
    .filter(line => line.trim());

  const records = lines.map(line => {
    try {
      const record = JSON.parse(line);
      if (!record.id) {
        record.id = randomUUID();
      }
      return JSON.stringify(record);
    } catch (err) {
      console.error(`Skipping malformed line: ${err.message}`);
      return null;
    }
  }).filter(Boolean);

  writeFileSync(outputPath, records.join('\n') + '\n');
  console.log(`Assigned IDs to ${records.length} records → ${outputPath}`);
}

assignIds('warehouse-products.ndjson', 'warehouse-products-with-ids.ndjson');
// Assigned IDs to 1284 records → warehouse-products-with-ids.ndjson

Připojení Correlation ID k odchozímu API požadavku

Node.js — correlation ID pro distribuované trasování
import { randomUUID } from 'node:crypto';

async function createShipment(orderPayload) {
  const correlationId = randomUUID();

  try {
    const response = await fetch('https://api.logistics.dev/v2/shipments', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'X-Correlation-ID': correlationId,
        'X-Idempotency-Key': randomUUID(),
      },
      body: JSON.stringify(orderPayload),
    });

    if (!response.ok) {
      const errorBody = await response.text();
      throw new Error(`Shipment API returned ${response.status}: ${errorBody}`);
    }

    const result = await response.json();
    console.log(`Shipment created: ${result.shipment_id} (correlation: ${correlationId})`);
    return result;
  } catch (err) {
    console.error(`[correlation:${correlationId}] Shipment failed: ${err.message}`);
    throw err;
  }
}

await createShipment({
  order_id: "ord_8a3f91bc",
  destination: { city: "Praha", state: "CZ", zip: "11000" },
  items: [{ sku: "WH-7291", quantity: 2, weight_kg: 1.4 }],
});

Generování UUID z příkazové řádky

Ne vždy potřebujete skript. Node.js může generovat UUID přímo z příkazové řádky, což se hodí pro shell skripty, CI pipeline a rychlé ad-hoc testování. Příznak -e vyhodnotí jediný výraz.

bash — generování UUID z příkazové řádky
# Single UUID
node -e "console.log(crypto.randomUUID())"
# 3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f

# Five UUIDs at once
node -e "for(let i=0;i<5;i++) console.log(crypto.randomUUID())"

# Generate and assign to a shell variable
export REQUEST_ID=$(node -e "process.stdout.write(crypto.randomUUID())")
echo "Request ID: $REQUEST_ID"

# Use npx uuid (if you have the package installed globally or want a one-off)
npx uuid v4
# 1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed
bash — generování UUID v konzoli prohlížeče (bez Node.js)
# Open any browser DevTools console and type:
crypto.randomUUID()
# "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"
Poznámka:Pokud potřebujete UUID v CI pipeline a Node.js není k dispozici, uuidgen je předinstalováno na macOS a většině linuxových distribucí. Na moderních systémech generuje UUID v4 jako výchozí.

Výkonná alternativa — nanoid

Pokud generujete tisíce ID za sekundu a 36znakový formát UUID není pevným požadavkem, zvažte nanoid. Je 2× rychlejší než uuid.v4(), generuje 21znakové URL-safe ID jako výchozí a po minifikaci váží přibližně 1 KB. Výstup není UUID — je to ID s vlastní abecedou — takže ho nepoužívejte tam, kde je vyžadována shoda s RFC 4122 (sloupce UUID databáze, API validující formát UUID, OpenTelemetry trace ID). Ale pro interní correlation ID, klíče React komponent a URL slug je dobrou volbou.

bash — instalace nanoid
npm install nanoid
JavaScript — nanoid pro krátká jedinečná ID
import { nanoid, customAlphabet } from 'nanoid';

// Default: 21-char URL-safe ID (A-Za-z0-9_-)
const trackingCode = nanoid();
console.log(trackingCode);
// "V1StGXR8_Z5jdHi6B-myT"

// Custom length
const shortCode = nanoid(10);
console.log(shortCode);
// "IRFa-VaY2b"

// Custom alphabet — numbers only, 12 digits
const numericId = customAlphabet('0123456789', 12);
console.log(numericId());
// "839274651023"

// Custom alphabet — hex only, 32 chars (same entropy as UUID v4 without hyphens)
const hexId = customAlphabet('0123456789abcdef', 32);
console.log(hexId());
// "4f8a1b2c3d7e9f0a5b6c8d1e2f3a4b5c"

Výstup terminálu se zvýrazněním syntaxe

Ladění aplikací s mnoha UUID znamená zírání na stěny hex řetězců v terminálu. Barevné kódování pomáhá. Knihovna chalk (nebo novější vestavěná funkce node:util styleText v Node.js 21.7+) umožňuje zvýrazňovat UUID v logovacím výstupu, aby vynikly z okolního textu.

Node.js — barevně kódovaný výstup UUID s chalk
import chalk from 'chalk';
import { randomUUID } from 'node:crypto';

function logEvent(action, metadata = {}) {
  const eventId = randomUUID();
  const timestamp = new Date().toISOString();

  console.log(
    chalk.gray(timestamp),
    chalk.cyan(eventId),
    chalk.white(action),
    Object.keys(metadata).length
      ? chalk.dim(JSON.stringify(metadata))
      : ''
  );
}

logEvent('shipment.created', { order_id: 'ord_8a3f', carrier: 'fedex' });
logEvent('payment.captured', { amount_cents: 14999, currency: 'USD' });
logEvent('webhook.delivered', { endpoint: 'https://hooks.acme.dev/orders' });
// 2026-03-27T10:15:00.000Z  a1b2c3d4-...  shipment.created  {"order_id":"ord_8a3f",...}
Varování:Escape kódy barev poškozují log soubory a rozbíjejí JSON parsery. Chalk nebo styleText používejte pouze pro výstup terminálu, který přímo čte člověk. Pro strukturované logy zapisované do souboru nebo log agregátoru používejte čisté JSON.

Generování krátkých jedinečných ID v JavaScriptu

36znakové UUID je někdy příliš dlouhé — URL slug, data QR kódu, SMS zprávy a embedded hardwarové protokoly mají omezení délky.

JavaScript — tři techniky pro kratší ID
import { randomUUID } from 'node:crypto';

// 1. Strip hyphens from UUID v4 → 32-char hex string
const hex32 = randomUUID().replaceAll('-', '');
console.log(hex32);
// "3e7f1a924b0c4d8e9f127a6b3c8d5e1f" (32 chars)

// 2. Base64-encode 16 random bytes → 22-char string (URL-safe)
const bytes = new Uint8Array(16);
crypto.getRandomValues(bytes);
const base64Id = Buffer.from(bytes)
  .toString('base64url')
  .replace(/=+$/, '');
console.log(base64Id);
// "Pj8akksNTY6fEnarPIvR" (22 chars, 128 bits of entropy)

// 3. nanoid at custom length
import { nanoid } from 'nanoid';
const short12 = nanoid(12);
console.log(short12);
// "V1StGXR8_Z5j" (12 chars, ~71 bits of entropy)

Matematika pravděpodobnosti kolize: 12znakový nanoid (výchozí abeceda 64 znaků) poskytuje přibližně 71 bitů entropie. Při 1 000 ID za sekundu byste potřebovali přibližně 116 let, než byste dosáhli 1% pravděpodobnosti kolize. Pro většinu aplikací je to více než dostatečné. Pokud generujete miliony ID denně, držte se plného UUID nebo použijte nanoid s alespoň 21 znaky.

UUID v7 — časově řazená alternativa k v4

UUID v7 (definováno v RFC 9562) vkládá 48bitový Unix milisekundový timestamp do prvního segmentu, za nímž následují náhodné bity. Výsledkem je UUID, které vypadá podobně jako v4, ale řadí se chronologicky. To z něj činí lepší volbu než v4 pro primární klíče databází: nové řádky vždy přistávají na konec B-stromového indexu místo na náhodné pozice, což snižuje dělení stránek a fragmentaci. V projektech, kde potřebuji časově řazená ID pro Postgres tabulku, přecházím okamžitě na v7 — rozdíl ve výkonu indexu je měřitelný ve větším měřítku. UUID v7 Generator na ToolDeck zobrazuje vložený timestamp pro libovolné v7 UUID.

JavaScript — UUID v7 s balíčkem uuid
import { v7 as uuidv7 } from 'uuid';

// Generate three UUID v7 values — notice they sort chronologically
const id1 = uuidv7();
const id2 = uuidv7();
const id3 = uuidv7();

console.log(id1);
// "018e4a0c-5b3f-7d12-8a9b-0c1d2e3f4a5b"
console.log(id2);
// "018e4a0c-5b40-7e34-9c2d-1e4f5a6b7c8d"
console.log(id3);
// "018e4a0c-5b41-7f56-ae3f-2a5b6c7d8e9f"

// They sort lexicographically by creation time
console.log([id3, id1, id2].sort());
// [id1, id2, id3] — chronological order preserved

// Use v4 for tokens where timing should not be leaked
import { v4 as uuidv4 } from 'uuid';
const sessionToken = uuidv4(); // fully random, no timing info
Poznámka:Balíček uuid podporuje v7 od verze 9.0.0. Pokud používáte starší verzi, spusťte npm install uuid@latest pro aktualizaci.

UUID v4 v prohlížeči bez build kroku

Žádný bundler, žádný npm, žádný transpiler. Jen čistý HTML soubor. Toto je nejjednodušší možný způsob generování UUID v client-side JavaScriptu. Funguje, protože crypto.randomUUID() je vestavěné API prohlížeče.

HTML — minimální generátor UUID v prohlížeči
<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"><title>UUID Generator</title></head>
<body>
  <p>Your UUID: <strong id="output"></strong></p>
  <button onclick="document.getElementById('output').textContent = crypto.randomUUID()">
    Generate
  </button>
  <script>
    // Generate one on page load
    document.getElementById('output').textContent = crypto.randomUUID();
  </script>
</body>
</html>

To je celý soubor. Žádné CDN importy, žádné script tagy načítající knihovny. Pro cokoliv složitějšího — dávkové generování, validace, deterministická ID — budete chtít balíček uuid nebo dříve ukázaný ruční fallback. Ale pro rychlý prototyp nebo interní nástroj to stačí.

Časté chyby

Viděl jsem vzor UUID s Math.random() zkopírovaný ze starých blogových příspěvků do produkčního kódu častěji, než bych chtěl přiznat. Chyby, které tyto vzory způsobují, jsou tiché: žádná runtime chyba, jen jemně nesprávné chování, které se projeví později při zátěži nebo bezpečnostních auditech.

Použití Math.random() pro generování UUID

Problém: Math.random() není kryptograficky bezpečné. Jeho výstup je v některých enginech předvídatelný a nízká entropie činí kolize mnohem pravděpodobnějšími než u správného CSPRNG.

Řešení: Vždy používejte crypto.randomUUID() nebo crypto.getRandomValues(). Obě používají CSPRNG operačního systému.

Before · JavaScript
After · JavaScript
// INSECURE — predictable, low entropy
function badUuid() {
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(
    /[xy]/g,
    c => {
      const r = Math.random() * 16 | 0;
      return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
    }
  );
}
// SECURE — uses the OS CSPRNG
const id = crypto.randomUUID();

// Or if you need a manual fallback:
function secureUuid() {
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);
  bytes[6] = (bytes[6] & 0x0f) | 0x40;
  bytes[8] = (bytes[8] & 0x3f) | 0x80;
  const h = [...bytes].map(b => b.toString(16).padStart(2, '0'));
  return `${h.slice(0,4).join('')}-${h.slice(4,6).join('')}-${h.slice(6,8).join('')}-${h.slice(8,10).join('')}-${h.slice(10).join('')}`;
}
Porovnávání UUID se case-sensitive rovností

Problém: crypto.randomUUID() vrací malá hex písmena, ale UUID z jiných systémů (databáze, API, uživatelský vstup) mohou používat velká písmena. Přímé porovnání === selže, když se liší velikost písmen.

Řešení: Před porovnáváním normalizujte obě strany na malá písmena.

Before · JavaScript
After · JavaScript
const fromApi = "9B1DEB4D-3B7D-4BAD-9BDD-2B0D7B3DCB6D"; // uppercase from API
const local  = "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d";  // lowercase from crypto

if (fromApi === local) { /* never runs */ }
const fromApi = "9B1DEB4D-3B7D-4BAD-9BDD-2B0D7B3DCB6D";
const local  = "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d";

if (fromApi.toLowerCase() === local.toLowerCase()) {
  // matches correctly
}
Ukládání UUID jako objektů místo řetězců

Problém: Některé UUID knihovny (zejména v jiných jazycích) vrací UUID objekty. V JavaScriptu náhodné zabalení UUID řetězce do objektu rozbíjí kontroly rovnosti, JSON serializaci a databázové dotazy.

Řešení: Vždy ukládejte a předávejte UUID jako prosté řetězce. Pokud knihovna vrací objekt, okamžitě zavolejte .toString() nebo přistupte k řetězcové vlastnosti.

Before · JavaScript
After · JavaScript
// Creating unnecessary wrapper
class UUID {
  constructor(value) { this.value = value; }
}
const id = new UUID(crypto.randomUUID());
console.log(id === id); // true, but...
console.log(JSON.stringify({ id })); // {"id":{"value":"..."}}
// Just use a string
const id = crypto.randomUUID();
console.log(JSON.stringify({ id }));
// {"id":"3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f"}
Považování UUID v4 za řaditelné

Problém: UUID v4 je zcela náhodné. Řazení podle UUID v4 dává libovolné pořadí, nikoli pořadí vytvoření. To vede k nepředvídatelné stránkování, matoucímu adminovému UI a špatnému výkonu indexu databáze.

Řešení: Používejte UUID v7, pokud potřebujete časově řazené identifikátory. Ponechte UUID v4 pro tokeny a correlation ID, kde pořadí řazení není relevantní.

Before · JavaScript
After · JavaScript
// Bad: using v4 as a sortable primary key
const rows = [
  { id: crypto.randomUUID(), created: "2026-03-27" },
  { id: crypto.randomUUID(), created: "2026-03-26" },
];
rows.sort((a, b) => a.id.localeCompare(b.id));
// Sort order is random — NOT by creation date
import { v7 as uuidv7 } from 'uuid';
// Good: v7 sorts by creation time
const rows = [
  { id: uuidv7(), created: "2026-03-27" },
  { id: uuidv7(), created: "2026-03-26" },
];
rows.sort((a, b) => a.id.localeCompare(b.id));
// Sort order matches creation time

crypto.randomUUID() vs uuid vs nanoid — Rychlé srovnání

Metoda
Formát výstupu
Verze UUID
Velikost balíčku
Vlastní typy
Vyžaduje instalaci
crypto.randomUUID()
36znakový UUID v4
pouze v4
0 KB
N/A
Ne (vestavěné)
uuid npm balíček
36znakový UUID
v1, v3, v4, v5, v6, v7
~6,5 KB
N/A
npm install
nanoid
21znakové URL-safe ID
Vlastní (není UUID)
~1 KB
N/A
npm install
Ruční getRandomValues
36znakový UUID v4
pouze v4
0 KB
N/A
Ne (vestavěné)
crypto.randomBytes (Node)
Buffer → 36znakový UUID v4
pouze v4
0 KB
N/A
Ne (Node vestavěné)
uuidv7 npm balíček
36znakový UUID v7
pouze v7
~2 KB
N/A
npm install

Pro většinu JavaScriptových projektů: používejte crypto.randomUUID() pokud potřebujete pouze UUID v4 a váš runtime je dostatečně nový. Po balíčku uuid sáhněte, když potřebujete podporu v5 (deterministické) nebo v7 (časově řazené). Použijte nanoid pokud je krátké, URL-safe ID praktičtější než 36znakové UUID — ale pamatujte, že výstup nanoid není UUID-kompatibilní a selže při validaci na jakémkoliv systému očekávajícím formát RFC 4122.

Pro alternativu bez kódu vyzkoušejte UUID v4 Generator pro okamžité vytváření identifikátorů v prohlížeči. Pro kontrolu existujícího UUID ho vložte do UUID Decoder a zjistěte jeho verzi, variantu a případná vložená data timestamps.

Často kladené otázky

Jak vygeneruji UUID v4 v JavaScriptu?

Zavolejte crypto.randomUUID() v libovolném moderním prohlížeči (Chrome 92+, Firefox 95+, Safari 15.4+) nebo Node.js 19+. Vrátí řetězec malými písmeny jako "3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f". V prohlížeči není potřeba žádný import, protože crypto je vestavěný globální objekt; v Node.js můžete také použít import { randomUUID } from "node:crypto" pro explicitní odkaz na modul. Pro starší runtime než Node.js 19 lze stále volat crypto.randomUUID() na globálním objektu — bylo dostupné experimentálně od Node.js 14.17.0. Pokud potřebujete možnost bez kódu, generátor UUID v4 na /en/uuid/v4 vytváří kompatibilní identifikátory jedním kliknutím.

JavaScript
const sessionId = crypto.randomUUID();
console.log(sessionId);
// "3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f"

Je crypto.randomUUID() kryptograficky bezpečné?

Ano. crypto.randomUUID() používá stejný CSPRNG (kryptograficky bezpečný pseudonáhodný generátor čísel) jako crypto.getRandomValues(). 122 náhodných bitů v UUID v4 činí pravděpodobnost kolize zanedbatelnou pro všechny praktické účely — musel byste vygenerovat přibližně 2,71 kvintilionu UUID, než byste dosáhli 50% pravděpodobnosti jediné kolize. Entropie pochází z náhodného zdroje operačního systému (/dev/urandom na Linuxu, BCryptGenRandom na Windows), nikoli z Math.random(), který není kryptograficky bezpečný. UUID v4 jsou proto bezpečné pro použití jako session tokeny, CSRF tokeny a další bezpečnostně citlivé identifikátory, kde je třeba zabránit předvídatelnosti. Nikdy nenahrazujte bezpečnostní kontexty UUID generátory založenými na Math.random().

Mohu použít UUID v4 jako primární klíč databáze?

Můžete, ale existuje nezanedbatelný výkonnostní kompromis. UUID v4 je zcela náhodné, takže B-stromové indexy se silně fragmentují, protože každý nový řádek se vkládá na náhodnou pozici v indexu místo na konec. V tabulkách s velkým počtem zápisů to způsobuje nadměrné dělení stránek a cache missy, což zhoršuje výkon INSERT a range-scan operací. Pokud vaše databáze podporuje (PostgreSQL, MySQL 8.0+, SQL Server), UUID v7 (časově řazené) je lepší primární klíč, protože nové řádky se vždy přidávají na konec indexu. UUID v4 zůstává správnou volbou pro session tokeny, OAuth state parametry, idempotency klíče, correlation ID a jakékoliv pole, kde je žádoucí skrýt čas vytvoření.

JavaScript
// UUID v4 — náhodné, nelze řadit
const correlationId = crypto.randomUUID();

// UUID v7 — časově řazené, lepší pro primární klíče DB
import { v7 as uuidv7 } from 'uuid';
const rowId = uuidv7();

Jaký je rozdíl mezi UUID v4 a UUID v7?

UUID v4 naplní 122 bitů náhodnými daty — každý segment je v podstatě šum. UUID v7 (RFC 9562, publikováno 2024) zakóduje 48bitový Unix milisekundový timestamp v prvním segmentu, 12 bitů sub-milisekundové přesnosti ve druhém segmentu a náhodné bity ve zbytku. Obě jsou celkem 128 bitů a používají stejný 36znakový formát s pomlčkami, takže jsou zaměnitelné na úrovni úložiště. UUID v7 je lexikograficky řaditelné podle času vytvoření, což udržuje B-stromové indexy kompaktní a umožňuje efektivní range dotazy na časová okna. Vyberte UUID v4, když ID nesmí odhalit, kdy bylo vytvořeno — například veřejně dostupné tokeny, kde by informace o čase mohla být zneužita — a UUID v7 pro primární klíče databází, auditní logy a event streamy, kde záleží na chronologickém pořadí.

Jak zvaliduji řetězec UUID v4 v JavaScriptu?

Testujte oproti regulárnímu výrazu /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i. Literál "4" na pozici 15 (indexováno od 0) potvrzuje nibble verze; znak na pozici 20 — jeden z 8, 9, a nebo b — kóduje RFC 4122 bity varianty. Tento regulární výraz správně odmítne UUID v1, v7 a jakýkoliv špatně formátovaný řetězec. Příznak i ho činí case-insensitive, takže velká hex písmena z jiných systémů projdou validací bez normalizace. Pokud potřebujete pouze zjistit, zda je řetězec platným UUID (bez ohledu na verzi), použijte místo toho volnější vzor /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.

JavaScript
const UUID_V4_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;

UUID_V4_RE.test("550e8400-e29b-41d4-a716-446655440000"); // true
UUID_V4_RE.test("550e8400-e29b-11d4-a716-446655440000"); // false (v1)
UUID_V4_RE.test("not-a-uuid"); // false

Jak vygeneruji krátké jedinečné ID v JavaScriptu?

Odstraňte pomlčky z UUID v4 a získáte 32znakový hex řetězec: crypto.randomUUID().replaceAll("-", ""). Pro ještě kratší řešení použijte nanoid, který generuje 21znakové URL-safe ID (A–Z, a–z, 0–9, _ a -) s porovnatelnou odolností vůči kolizím jako plné UUID. Kompromis je přímočarý: kratší ID mají vyšší pravděpodobnost kolize, ale nanoid při 21 znacích stále poskytuje 126 bitů entropie, což je více než dostatečné pro prakticky každou reálnou aplikaci. Pro URL slugy a data QR kódů můžete jít až na 10–12 znaků s nanoidem, než se pravděpodobnost kolize stane problémem při typických rychlostech generování. Vyhněte se Base64 kódování surového UUID a jeho zkracování — zkrácení narušuje statistickou nezávislost bitů a ztěžuje uvažování o kolizích.

JavaScript
// 32znakový hex řetězec z UUID v4
const hexId = crypto.randomUUID().replaceAll('-', '');
// "3e7f1a924b0c4d8e9f127a6b3c8d5e1f"

// 21znakové URL-safe ID pomocí nanoid
import { nanoid } from 'nanoid';
const shortId = nanoid();
// "V1StGXR8_Z5jdHi6B-myT"

Související nástroje

Dostupné také v:Python
SL
Sophie LaurentTypeScript & Full-stack Developer

Sophie is a full-stack developer focused on TypeScript across the entire stack — from React frontends to Express and Fastify backends. She has a particular interest in type-safe API design, runtime validation, and the patterns that make large JavaScript codebases stay manageable. She writes about TypeScript idioms, Node.js internals, and the ever-evolving JavaScript module ecosystem.

MW
Marcus WebbTechnický recenzent

Marcus specialises in JavaScript performance, build tooling, and the inner workings of the V8 engine. He has spent years profiling and optimising React applications, working on bundler configurations, and squeezing every millisecond out of critical rendering paths. He writes about Core Web Vitals, JavaScript memory management, and the tools developers reach for when performance really matters.