Generera UUID v4 i JavaScript — Guide
Använd det kostnadsfria UUID v4 Generator direkt i webbläsaren — ingen installation krävs.
Prova UUID v4 Generator online →Varje JavaScript-applikation behöver förr eller senare unika identifierare — sessionstokens, databasrader, idempotensnycklar för betalnings-API:er, korrelations-ID:n för distribuerad spårning. Det enklaste sättet att generera UUID v4 i JavaScript idag är crypto.randomUUID(): inga beroenden, en rad kod, kryptografiskt säker. UUID v4 används brett just för att det inte kräver koordination mellan tjänster — klient och server kan båda generera ID:n oberoende utan risk för kollisioner. Den här guiden täcker det inbyggda API:et, npm-paketet uuid, validering — allt för Node.js 19+ och moderna webbläsare. För ett alternativ utan kod erbjuder UUID v4 Generator på ToolDeck kompatibla identifierare direkt.
- ✓crypto.randomUUID() är inbyggt i webbläsare och Node.js — inga beroenden, en rad kod.
- ✓UUID v4 är en 128-bitars slumpmässig identifierare: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx (y är 8, 9, a eller b).
- ✓Validera med /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i — kontrollerar versions- och variantbitar.
- ✓npm-paketet uuid lägger till stöd för v1, v3, v5 och v7 när du behöver mer än slumpmässiga ID:n.
- ✓För databasprimärnycklar, föredra UUID v7 (tidssorterat) framför v4 (slumpmässigt) för att minska indexfragmentering.
Vad är UUID v4?
Ett UUID (Universally Unique Identifier) version 4 är en 128-bitars slumpmässig identifierare formaterad som 32 hexadecimala siffror separerade av fyra bindestreck: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx. Siffran 4 på position 15 markerar versionen. Tecknet y på position 20 är ett av 8, 9, a eller b (RFC 4122-varianten). De återstående 122 bitarna är slumpmässiga. UUID v4 är den vanligaste versionen i JavaScript-applikationer eftersom det inte kräver koordination mellan system — du kan generera ID:n oberoende på klient och server utan att oroa dig för kollisioner.
// Ingen identifierare
const event = { action: "user.login", ts: 1711824000 };// Med UUID v4
const event = {
id: "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
action: "user.login",
ts: 1711824000
};crypto.randomUUID() — Den inbyggda JavaScript-metoden
crypto.randomUUID() finns tillgänglig i Chrome 92+, Firefox 95+, Safari 15.4+ och Node.js 19+ (med experimentellt stöd från Node.js 14.17.0 bakom globalThis.crypto). Det returnerar en gemen 36-tecken UUID v4-sträng. Ingen import behövs i webbläsar-JavaScript. I Node.js kan du anropa det direkt på det globala crypto-objektet eller importera det explicit från node:crypto-modulen.
// Fungerar i alla moderna webbläsare — inget byggsteg, ingen bundler
const requestId = crypto.randomUUID();
console.log(requestId);
// "3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f"
// Använd det var du behöver en unik identifierare
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));// Metod 1: global crypto (Node.js 19+)
const orderId = crypto.randomUUID();
console.log(orderId);
// "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d"
// Metod 2: explicit import från node:crypto
import { randomUUID } from 'node:crypto';
const correlationId = randomUUID();
console.log(correlationId);
// "f7e6d5c4-b3a2-4190-8f7e-6d5c4b3a2190"Det är värt att feature-detektera crypto.randomUUID om din kod kan köras i äldre webbläsare eller inbäddade WebViews. Kontrollen är ett enkelt typeof-skydd:
function generateUUIDv4() {
// Föredra det inbyggda API:et när det finns tillgängligt
if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
return crypto.randomUUID();
}
// Manuell fallback med getRandomValues (se nästa avsnitt)
const bytes = new Uint8Array(16);
crypto.getRandomValues(bytes);
// Sätt version (4) och variant (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"crypto.randomUUID() alltid tillgänglig. Det ger ett fel på icke-säkra HTTP-sidor i vissa webbläsare. Om din applikation någonsin körs på vanlig HTTP under utveckling hanterar getRandomValues-fallbacken ovan det fallet.Generera UUID v4 utan ett bibliotek
Ibland kan du inte förlita dig på crypto.randomUUID() — kanske riktar du dig mot en WebView som tar bort crypto-API:et, eller du vill förstå vad som händer under huven. Den manuella metoden använder crypto.getRandomValues() (tillgänglig sedan IE 11) för att fylla 16 byte med slumpmässig data, och applicerar sedan två bitmaskoperationer för att sätta versions- och variantfälten. Dessa två operationer är den enda skillnaden mellan UUID v4 och en ren slumpmässig byte-sträng.
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)); // trueMath.random() för att generera UUID:n. Det är inte kryptografiskt säkert, dess utdataperiod är för kort och vissa motorer producerar förutsägbara sekvenser. Använd alltid crypto.getRandomValues() eller crypto.randomUUID().npm-paketet uuid — Stöd för flera versioner
Paketet uuid på npm har varit standardbiblioteket för UUID i JavaScript sedan innan crypto.randomUUID() existerade. Det är fortfarande motiverat i tre situationer: du behöver andra UUID-versioner än v4 (v1, v3, v5, v7), du riktar dig mot körtider äldre än Node.js 14.17.0, eller du vill ha validate- och parse-hjälpfunktionerna. För enkel UUID v4 på en modern körtid räcker det inbyggda API:et och jag skulle hoppa över beroendet.
npm install uuid
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);uuid använder internt crypto.getRandomValues() i webbläsare och crypto.randomBytes() i Node.js, så entropikällan är identisk med det inbyggda API:et. Skillnaden är bara de extra hjälpfunktionerna och stödet för flera versioner.Om du föredrar att inte skriva kod alls, prova UUID v4 Generator — den genererar RFC 4122-kompatibla v4-identifierare direkt i din webbläsare med ett klick.
Deterministiska UUID:n — Generera UUID v5 från en sträng
UUID v4 är slumpmässigt per definition — att anropa det två gånger ger alltid olika resultat. Ibland behöver du det motsatta: samma inmatningssträng ska alltid producera samma UUID. Det är vad UUID v5 gör. Det hashar ett namnrymds-UUID och en inmatningssträng med SHA-1 och formaterar sedan resultatet som ett UUID. Samma namnrymd + samma inmatning = samma utdata, varje gång, på varje maskin. Detta är användbart för att härleda stabila ID:n från URL:er, e-postadresser eller vilken sträng som helst som redan identifierar en resurs.
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"En snabb notering: UUID v3 gör samma sak men med MD5 istället för SHA-1. Föredra v5 för nya projekt. MD5 har kända kollisionssvagheter och även om det inte spelar så stor roll för ID-generering finns det ingen anledning att välja det framför SHA-1 när båda finns tillgängliga.
Referens för crypto.randomUUID() och relaterade API:er
Det inbyggda crypto.randomUUID() tar inga argument — det returnerar en sträng och inget annat. Använd det när du behöver RFC 4122- kompatibla identifierare utan beroenden. När du behöver råa slumpmässiga byte istället för en formaterad UUID-sträng — till exempel för att fylla ett typed array eller härleda en nyckel — använd crypto.getRandomValues() direkt. De relaterade API:erna som är viktiga för UUID-arbete listas nedan.
Uppdelning av UUID v4-regexmönster:
Validera UUID v4 med Regex
Att validera att en sträng är ett korrekt UUID v4 dyker upp hela tiden — inkommande API-förfrågningskroppar, URL-parametrar, webhook-nyttolaster. Ett handskrivet regex är rätt val när du vill ha inga beroenden och bara validerar v4. Om du redan använder paketet uuid föredrar du dess validate()-export istället — den hanterar alla UUID-versioner och är mindre felbenägen än att underhålla ett anpassat mönster. Regex /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i kontrollerar både versionsnibble (måste vara 4) och variantnibble (måste vara 8, 9, a eller b). Använd RegExp.prototype.test() för booleska kontroller och .match() när du behöver extrahera ett UUID från omgivande text.
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"Generera och tilldela UUID:n från fil och API-svar
I praktiken anropar du sällan crypto.randomUUID() isolerat. Två mönster dyker upp hela tiden: tilldela ID:n till poster innan de skrivs till en databas, och bifoga korrelations-ID:n till utgående API-förfrågningar så att du kan spåra en förfrågan mellan tjänster i dina loggar.
Läs NDJSON-fil → Tilldela UUID:n → Skriv tillbaka
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.ndjsonBifoga korrelations-ID till utgående API-förfrågan
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: "Stockholm", state: "Stockholm", zip: "111 22" },
items: [{ sku: "WH-7291", quantity: 2, weight_kg: 1.4 }],
});UUID-generering på kommandoraden
Du behöver inte alltid ett skript. Node.js kan generera ett UUID direkt från kommandoraden, vilket är praktiskt för shell-skript, CI-pipelines och snabba ad-hoc-tester. Flaggan -e utvärderar ett enstaka uttryck.
# 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
# Open any browser DevTools console and type: crypto.randomUUID() # "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"
uuidgen förinstallerat på macOS och de flesta Linux- distributioner. Det genererar UUID v4 som standard på moderna system.Högpresterande alternativ — nanoid
Om du genererar tusentals ID:n per sekund och 36-teckens UUID-formatet inte är ett hårt krav, överväg nanoid. Det är 2x snabbare än uuid.v4(), producerar ett 21-tecken URL-säkert ID som standard och väger ungefär 1 KB efter minifiering. Utdata är inte ett UUID — det är ett anpassat alfabets-ID — så använd det inte där RFC 4122- kompatibilitet krävs (UUID-kolumner i databaser, API:er som validerar UUID-format, OpenTelemetry trace-ID:n). Men för interna korrelations-ID:n, React-komponentnycklar och URL-slugs passar det bra.
npm install nanoid
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"Terminalutdata med syntaxmarkering
Att felsöka UUID-tunga applikationer innebär att stirra på väggar av hex-strängar i terminalen. Färgkodning hjälper. Biblioteket chalk (eller det nyare inbyggda node:util styleText i Node.js 21.7+) låter dig markera UUID:n i loggutdata så att de sticker ut från omgivande text.
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",...}Generera korta unika ID:n i JavaScript
Ett 36-tecken UUID är ibland för långt — URL-slugs, QR-kodsdata, SMS-meddelanden och inbyggda hårdvaruprotokoll har alla längdbegränsningar.
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)Kollisionssannolikhetsmatematiken: ett 12-teckens nanoid (standardalfabet med 64 tecken) ger ungefär 71 bitar entropi. Vid 1 000 ID:n per sekund skulle du behöva ungefär 116 år för att nå 1% kollisionssannolikhet. För de flesta applikationer är det mer än tillräckligt. Om du genererar miljontals ID:n per dag, håll dig till det fulla UUID:t eller använd nanoid med minst 21 tecken.
UUID v7 — Tidssorterat alternativ till v4
UUID v7 (definierat i RFC 9562) bäddar in en 48-bitars Unix-millisekundstidsstämpel i det första segmentet, följt av slumpmässiga bitar. Resultatet är ett UUID som liknar v4 men sorteras kronologiskt. Det gör det till ett bättre val än v4 för databasprimärnycklar: nya rader hamnar alltid i slutet av B-trädindexet istället för på slumpmässiga positioner, vilket minskar siddelningar och fragmentering. I projekt där jag behöver tidssorterade ID:n för en Postgres-tabell byter jag omedelbart till v7 — indexprestandaskillnaden är mätbar i stor skala. UUID v7 Generator på ToolDeck visar den inbäddade tidsstämpeln för vilket v7 UUID som helst.
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 infouuid stöder v7 från version 9.0.0 och framåt. Om du använder en äldre version, kör npm install uuid@latest för att uppgradera.UUID v4 i webbläsaren utan ett byggsteg
Ingen bundler, ingen npm, ingen transpiler. Bara en vanlig HTML-fil. Det här är det enklaste möjliga sättet att generera ett UUID i klientbaserat JavaScript. Det fungerar eftersom crypto.randomUUID() är ett inbyggt webbläsar-API.
<!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>Det är hela filen. Inga CDN-importer, inga script-taggar som hämtar bibliotek. För något mer komplext — batchgenerering, validering, deterministiska ID:n — behöver du uuid-paketet eller den manuella fallbacken som visades tidigare. Men för en snabb prototyp eller ett internt verktyg är det här allt du behöver.
Vanliga misstag
Jag har sett Math.random() UUID-mönstret kopierat från gamla blogginlägg in i produktionskod oftare än jag gärna vill erkänna. Buggarna dessa mönster introducerar är tysta: inget körtidsfel, bara subtilt felaktigt beteende som dyker upp senare under belastning eller i säkerhetsgranskningar.
Problem: Math.random() är inte kryptografiskt säker. Dess utdata är förutsägbar i vissa motorer och den låga entropin gör kollisioner mycket mer troliga än med en korrekt CSPRNG.
Lösning: Använd alltid crypto.randomUUID() eller crypto.getRandomValues(). Båda använder operativsystemets CSPRNG.
// 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('')}`;
}Problem: crypto.randomUUID() returnerar gemener hex, men UUID:n från andra system (databaser, API:er, användarinmatning) kan använda versaler. Direkt ===-jämförelse misslyckas när skiftläget skiljer sig.
Lösning: Normalisera båda sidorna till gemener innan jämförelse.
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
}Problem: Vissa UUID-bibliotek (framför allt i andra språk) returnerar UUID-objekt. I JavaScript bryter ett oavsiktligt inpackat UUID-objekt jämförelsekontroller, JSON-serialisering och databasfrågor.
Lösning: Lagra och skicka alltid UUID:n som vanliga strängar. Om ett bibliotek returnerar ett objekt, anropa .toString() eller kom åt strängegenskapen direkt.
// 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"}Problem: UUID v4 är helt slumpmässigt. Sortering på UUID v4 ger godtycklig ordning, inte skapandeordning. Detta leder till oförutsägbar paginering, förvirrande admin-gränssnitt och dålig databas-indexprestanda.
Lösning: Använd UUID v7 när du behöver tidssorterade identifierare. Behåll UUID v4 för tokens och korrelations-ID:n där sorteringsordning är irrelevant.
// 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 dateimport { 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 timecrypto.randomUUID() vs uuid vs nanoid — Snabb jämförelse
För de flesta JavaScript-projekt: använd crypto.randomUUID() när du bara behöver UUID v4 och din körtid är tillräckligt modern. Ta till uuid-paketet när du behöver stöd för v5 (deterministiskt) eller v7 (tidssorterat). Använd nanoid när ett kort URL-säkert ID är mer praktiskt än ett 36-tecken UUID — men kom ihåg att nanoid-utdata inte är UUID-kompatibelt och misslyckas vid validering på system som förväntar sig RFC 4122- format.
För ett alternativ utan kod, prova UUID v4 Generator för att skapa identifierare direkt i webbläsaren. För att inspektera ett befintligt UUID, klistra in det i UUID Decoder för att se dess version, variant och eventuell inbäddad tidsstämpeldata.
Vanliga frågor
Hur genererar jag ett UUID v4 i JavaScript?
Anropa crypto.randomUUID() i vilken modern webbläsare som helst (Chrome 92+, Firefox 95+, Safari 15.4+) eller Node.js 19+. Det returnerar en gemen sträng som "3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f". Ingen import behövs i webbläsare eftersom crypto är ett inbyggt globalt objekt; i Node.js kan du även använda import { randomUUID } from "node:crypto" för att vara explicit om modulen. För körtider äldre än Node.js 19 kan du fortfarande anropa crypto.randomUUID() globalt — det fanns tillgängligt experimentellt från Node.js 14.17.0. Om du behöver ett alternativ utan kod genererar UUID v4 Generator på /en/uuid/v4 kompatibla identifierare med ett klick.
const sessionId = crypto.randomUUID(); console.log(sessionId); // "3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f"
Är crypto.randomUUID() kryptografiskt säker?
Ja. crypto.randomUUID() använder samma CSPRNG (kryptografiskt säker pseudoslumptalsgenerator) som ligger bakom crypto.getRandomValues(). De 122 slumpmässiga bitarna i ett UUID v4 gör kollisionssannolikheten försumbar för alla praktiska ändamål — du skulle behöva generera ungefär 2,71 kvintiljoner UUID:n innan du når 50% chans för en enda kollision. Entropin kommer från operativsystemets slumpmässiga källa (/dev/urandom på Linux, BCryptGenRandom på Windows), inte från Math.random(), som uttryckligen inte är kryptografiskt säker. Det innebär att UUID v4-värden är säkra att använda som sessionstokens, CSRF-tokens och andra säkerhetskänsliga identifierare där förutsägbarhet måste undvikas. Använd aldrig Math.random()-baserade UUID-generatorer i säkerhetssammanhang.
Kan jag använda UUID v4 som primärnyckel i en databas?
Det går, men det finns en märkbar prestandaavvägning. UUID v4 är helt slumpmässigt, vilket gör att B-trädindex fragmenteras kraftigt eftersom varje ny rad infogas på en slumpmässig position i indexet snarare än i slutet. I skrivtunga tabeller orsakar detta överdrivna siddelningar och cache-missar, vilket försämrar INSERT- och intervallskanningsprestanda. Om din databas stöder det (PostgreSQL, MySQL 8.0+, SQL Server) är UUID v7 (tidssorterat) en bättre primärnyckel eftersom nya rader alltid läggs till i slutet av indexet. UUID v4 är fortfarande rätt val för sessionstokens, OAuth-stateparametrar, idempotensnycklar, korrelations-ID:n och alla fält där det är önskvärt att dölja skapandetid.
// UUID v4 — random, not sortable
const correlationId = crypto.randomUUID();
// UUID v7 — time-ordered, better for DB primary keys
import { v7 as uuidv7 } from 'uuid';
const rowId = uuidv7();Vad är skillnaden mellan UUID v4 och UUID v7?
UUID v4 fyller 122 bitar med slumpmässig data — varje segment är i praktiken brus. UUID v7 (RFC 9562, publicerad 2024) kodar en 48-bitars Unix-millisekundstidsstämpel i det första segmentet, 12 bitar submillisekondsprecision i det andra segmentet och slumpmässiga bitar i resten. Båda är 128 bitar totalt och använder samma 36-teckens bindestreckformat, så de är utbytbara på lagringsnivå. UUID v7 kan sorteras lexikografiskt efter skapandetid, vilket håller B-trädindex kompakta och gör intervallfrågor på tidsfönster effektiva. Välj UUID v4 när ID:t inte får avslöja när det skapades — till exempel publikt exponerade tokens där tidinformation skulle kunna utnyttjas — och UUID v7 för databasprimärnycklar, revisionsloggar och händelseströmmar där kronologisk ordning är viktig.
Hur validerar jag en UUID v4-sträng i JavaScript?
Testa mot regex /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i. Det literala "4" på position 15 (0-indexerat) bekräftar versionsnibble; tecknet på position 20 — ett av 8, 9, a eller b — kodar RFC 4122-variantbitarna. Detta regex avvisar korrekt UUID v1, v7 och alla felformade strängar. Flaggan i gör det skiftlägesokänsligt, så versaler från andra system klarar validering utan normalisering. Om du bara behöver veta om en sträng är ett giltigt UUID (oavsett version), använd det mer generösa mönstret /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i istället.
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"); // falseHur genererar jag ett kort unikt ID i JavaScript?
Ta bort bindestreck från ett UUID v4 för att få en 32-tecken hexsträng: crypto.randomUUID().replaceAll("-", ""). För något ännu kortare, använd nanoid som som standard producerar ett 21-tecken URL-säkert ID (A–Z, a–z, 0–9, _ och -) med jämförbar kollisionsresistans som ett fullt UUID. Avvägningen är tydlig: kortare ID:n har högre kollisionssannolikhet, men nanoid med 21 tecken ger ändå 126 bitar entropi, vilket är mer än tillräckligt för praktiskt taget alla verkliga tillämpningar. För URL-slugs och QR-kodsdata kan du gå ner till 10–12 tecken med nanoid innan kollisionssannolikheten blir ett problem vid typiska genereringshastigheter. Undvik att Base64-koda ett råa UUID och trunkera det — trunkering förstör den statistiska oberoendet hos bitarna och gör kollisioner svårare att resonera kring.
// 32-char hex string from UUID v4
const hexId = crypto.randomUUID().replaceAll('-', '');
// "3e7f1a924b0c4d8e9f127a6b3c8d5e1f"
// 21-char URL-safe ID via nanoid
import { nanoid } from 'nanoid';
const shortId = nanoid();
// "V1StGXR8_Z5jdHi6B-myT"Relaterade verktyg
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.
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.