Generare UUID v4 in JavaScript — Guida

·TypeScript & Full-stack Developer·Revisionato daMarcus Webb·Pubblicato

Usa il Generatore UUID v4 gratuito direttamente nel tuo browser — nessuna installazione.

Prova Generatore UUID v4 online →

Ogni applicazione JavaScript prima o poi ha bisogno di identificatori univoci — token di sessione, righe di database, chiavi di idempotenza per API di pagamento, ID di correlazione per il tracciamento distribuito. Il modo più semplice per generare UUID v4 in JavaScript oggi è crypto.randomUUID(): zero dipendenze, una riga, crittograficamente sicuro. UUID v4 è ampiamente utilizzato proprio perché non richiede alcun coordinamento tra i servizi — client e server possono entrambi produrre ID indipendentemente senza rischio di collisioni. Questa guida tratta quell'API integrata, il pacchetto npm uuid, la validazione — tutto su Node.js 19+ e browser moderni. Per un'opzione senza codice, il Generatore UUID v4 su ToolDeck produce identificatori conformi istantaneamente.

  • crypto.randomUUID() è integrato nei browser e in Node.js — zero dipendenze, una riga di codice.
  • UUID v4 è un identificatore casuale a 128 bit: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx (y è 8, 9, a, o b).
  • Valida con /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i — controlla i bit di versione e variante.
  • Il pacchetto npm uuid aggiunge il supporto per v1, v3, v5 e v7 quando hai bisogno di più dei semplici ID casuali.
  • Per le chiavi primarie del database, preferisci UUID v7 (ordinato per tempo) rispetto a v4 (casuale) per ridurre la frammentazione dell'indice.

Cos'è UUID v4?

Un UUID (Universally Unique Identifier) versione 4 è un identificatore casuale a 128 bit formattato come 32 cifre esadecimali separate da quattro trattini: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx. Il 4 in posizione 15 indica la versione. Il carattere y in posizione 20 è uno tra 8, 9, a, o b (la variante RFC 4122). I restanti 122 bit sono casuali. UUID v4 è la versione più comune nelle applicazioni JavaScript perché non richiede coordinamento tra sistemi — puoi generare ID indipendentemente su client e server senza preoccuparti delle collisioni.

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

crypto.randomUUID() — L'approccio nativo JavaScript

crypto.randomUUID() è disponibile in Chrome 92+, Firefox 95+, Safari 15.4+ e Node.js 19+ (con supporto sperimentale da Node.js 14.17.0 tramite globalThis.crypto). Restituisce una stringa UUID v4 minuscola di 36 caratteri. Non è necessario alcun import nel browser JavaScript. In Node.js, puoi chiamarlo direttamente sull'oggetto globale cryptoo importarlo esplicitamente dal modulo node:crypto.

JavaScript — browser (zero import)
// Funziona in qualsiasi browser moderno — nessun build step, nessun bundler
const requestId = crypto.randomUUID();
console.log(requestId);
// "3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f"

// Usalo ovunque hai bisogno di un identificatore univoco
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 — due approcci equivalenti
// Approccio 1: crypto globale (Node.js 19+)
const orderId = crypto.randomUUID();
console.log(orderId);
// "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d"

// Approccio 2: import esplicito da node:crypto
import { randomUUID } from 'node:crypto';
const correlationId = randomUUID();
console.log(correlationId);
// "f7e6d5c4-b3a2-4190-8f7e-6d5c4b3a2190"

Vale la pena fare il rilevamento delle funzionalità per crypto.randomUUID se il tuo codice potrebbe girare su browser più vecchi o WebView incorporate. Il controllo è un singolo guard con typeof:

JavaScript — rilevamento funzionalità con fallback
function generateUUIDv4() {
  // Preferisce l'API nativa quando disponibile
  if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
    return crypto.randomUUID();
  }

  // Fallback manuale usando getRandomValues (vedi sezione successiva)
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);

  // Imposta la versione (4) e la variante (RFC 4122)
  bytes[6] = (bytes[6] & 0x0f) | 0x40; // versione 4
  bytes[8] = (bytes[8] & 0x3f) | 0x80; // variante 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"
Nota:In contesti sicuri (pagine HTTPS, localhost, estensioni del browser), crypto.randomUUID() è sempre disponibile. Genera un'eccezione su pagine HTTP non sicure in alcuni browser. Se la tua applicazione dovesse mai girare su HTTP semplice durante lo sviluppo, il fallback con getRandomValues mostrato sopra gestisce quel caso.

Genera UUID v4 senza una libreria

A volte non puoi fare affidamento su crypto.randomUUID() — forse stai puntando a una WebView che rimuove l'API crypto, o hai bisogno di capire cosa succede sotto il cofano. L'approccio manuale usa crypto.getRandomValues() (disponibile da IE 11) per riempire 16 byte con dati casuali, poi applica due operazioni di bitmask per impostare i campi di versione e variante. Queste due operazioni sono l'unica differenza tra UUID v4 e una stringa di byte puramente casuali.

JavaScript — UUID v4 manuale con getRandomValues
function uuidv4Manual() {
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);

  // Imposta la versione: bit 12–15 del byte 6 = 0100 (versione 4)
  bytes[6] = (bytes[6] & 0x0f) | 0x40;

  // Imposta la variante: bit 6–7 del 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"

// Verifica che superi la validazione 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;
console.log(UUID_V4_RE.test(traceId)); // true
Attenzione:Non usare mai Math.random() per generare UUID. Non è crittograficamente sicuro, il suo periodo di output è troppo breve, e alcuni motori producono sequenze prevedibili. Usa sempre crypto.getRandomValues() o crypto.randomUUID().

Il pacchetto npm uuid — supporto multi-versione

Il pacchetto uuid su npm è stata la libreria UUID di riferimento per JavaScript da prima che crypto.randomUUID() esistesse. Ha ancora senso in tre situazioni: hai bisogno di versioni UUID diverse dalla v4 (v1, v3, v5, v7), punti a runtime più vecchi di Node.js 14.17.0, o vuoi le funzioni di utilità validate e parse. Per UUID v4 semplice su un runtime moderno, l'API nativa è sufficiente e salterei la dipendenza.

bash — installazione
npm install uuid
JavaScript — pacchetto uuid per la generazione v4
import { v4 as uuidv4, validate, version } from 'uuid';

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

// Valida qualsiasi stringa UUID
console.log(validate(paymentId));    // true
console.log(validate("not-a-uuid")); // false

// Rileva la versione di un UUID
console.log(version(paymentId));     // 4

// Genera un batch per popolare un database di test
const testAccounts = Array.from({ length: 5 }, () => ({
  account_id: uuidv4(),
  plan: "starter",
  created_at: new Date().toISOString(),
}));
console.log(testAccounts);
Nota:Il pacchetto uuid internamente usa crypto.getRandomValues() nei browser e crypto.randomBytes() in Node.js, quindi la sorgente di entropia è identica all'API nativa. La differenza è solo nelle funzioni di utilità aggiuntive e nel supporto multi-versione.

Se preferisci non scrivere codice, prova il Generatore UUID v4 — genera identificatori v4 conformi a RFC 4122 direttamente nel browser con un clic.

UUID deterministici — Generare UUID v5 da una stringa

UUID v4 è casuale per definizione — chiamarlo due volte dà sempre risultati diversi. A volte hai bisogno dell'opposto: la stessa stringa di input dovrebbe produrre sempre lo stesso UUID. È quello che fa UUID v5. Calcola l'hash di un UUID namespace e una stringa di input con SHA-1, poi formatta il risultato come UUID. Stesso namespace + stesso input = stesso output, ogni volta, su ogni macchina. È utile per derivare ID stabili da URL, indirizzi email, o qualsiasi stringa che già identifica una risorsa.

JavaScript — uuid v5 per ID deterministici
import { v5 as uuidv5 } from 'uuid';

// Namespace integrato per URL (RFC 4122)
const URL_NAMESPACE = uuidv5.URL;
// "6ba7b811-9dad-11d1-80b4-00c04fd430c8"

// Lo stesso URL produce sempre lo stesso 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"

// Namespace personalizzato per la tua applicazione
const APP_NAMESPACE = "f47ac10b-58cc-4372-a567-0e02b2c3d479";
const tenantId = uuidv5("acme-corp", APP_NAMESPACE);
console.log(tenantId);
// "d4735e3a-265b-564e-8f32-7a1b2c3d4e5f"

Nota rapida: UUID v3 fa la stessa cosa ma con MD5 invece di SHA-1. Preferisci v5 per i nuovi progetti. MD5 ha note debolezze di collisione, e sebbene ciò non importi molto per la generazione di ID, non c'è motivo di sceglierlo rispetto a SHA-1 quando entrambi sono disponibili.

Riferimento a crypto.randomUUID() e API correlate

Il crypto.randomUUID() nativo non accetta argomenti — restituisce una stringa e nient'altro. Usalo quando hai bisogno di identificatori conformi a RFC 4122 con zero dipendenze. Quando hai bisogno di byte casuali grezzi invece di una stringa UUID formattata — ad esempio per riempire un typed array o derivare una chiave — usa crypto.getRandomValues() direttamente. Le API correlate rilevanti per il lavoro con UUID sono elencate di seguito.

Proprietà / Metodo
Tipo restituito
Descrizione
crypto.randomUUID()
string
Restituisce una stringa UUID v4 di 36 caratteri in esadecimale minuscolo con trattini
crypto.getRandomValues(arr)
TypedArray
Riempie un typed array con valori casualmente sicuri dal punto di vista crittografico — il blocco base per la generazione manuale di UUID
URL.createObjectURL(blob)
string
Genera un URL blob univoco (non un UUID, ma a volte confuso con esso)

Analisi del pattern regex per UUID v4:

Segmento
Pattern
Significato
[0-9a-f]{8}
xxxxxxxx
Prime 8 cifre esadecimali — 32 bit casuali
[0-9a-f]{4}
xxxx
Successive 4 cifre esadecimali — 16 bit casuali
4[0-9a-f]{3}
4xxx
Nibble di versione fisso a 4, seguito da 12 bit casuali
[89ab][0-9a-f]{3}
yxxx
Il nibble di variante è uno tra 8, 9, a, b — seguito da 12 bit casuali
[0-9a-f]{12}
xxxxxxxxxxxx
Ultime 12 cifre esadecimali — 48 bit casuali

Valida UUID v4 con Regex

Validare che una stringa sia un UUID v4 corretto è un'esigenza costante — body delle richieste API in entrata, parametri URL, payload di webhook. Una regex scritta a mano è la scelta giusta quando vuoi zero dipendenze e stai validando solo v4. Se stai già usando il pacchetto uuid, preferisci il suo export validate() — gestisce tutte le versioni UUID ed è meno soggetto a errori rispetto al mantenere un pattern personalizzato. La regex /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i controlla sia il nibble di versione (deve essere 4) che il nibble di variante (deve essere 8, 9, a, o b). Usa RegExp.prototype.test() per i controlli booleani e .match() quando hai bisogno di estrarre un UUID da testo circostante.

JavaScript — helper di validazione 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);
}

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

// UUID v1 — il nibble di versione è 1, non 4
console.log(isUUIDv4("550e8400-e29b-11d4-a716-446655440000")); // false

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

// Stringhe malformate
console.log(isUUIDv4("not-a-uuid"));           // false
console.log(isUUIDv4(""));                      // false
console.log(isUUIDv4("9b1deb4d3b7d4bad9bdd2b0d7b3dcb6d")); // false (senza trattini)

// Estrai UUID da una stringa più grande
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"

Genera e allega UUID da file e risposte API

In pratica, raramente chiami crypto.randomUUID() in isolamento. Due pattern ricorrono costantemente: assegnare ID ai record prima di scriverli in un database, e allegare ID di correlazione alle richieste API in uscita in modo da poter tracciare una richiesta attraverso i servizi nei log.

Leggi file NDJSON → Assegna UUID → Riscrivi

Node.js — assegna UUID ai record da un file
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(`Riga malformata ignorata: ${err.message}`);
      return null;
    }
  }).filter(Boolean);

  writeFileSync(outputPath, records.join('\n') + '\n');
  console.log(`ID assegnati a ${records.length} record → ${outputPath}`);
}

assignIds('warehouse-products.ndjson', 'warehouse-products-with-ids.ndjson');
// ID assegnati a 1284 record → warehouse-products-with-ids.ndjson

Allega ID di correlazione alla richiesta API in uscita

Node.js — ID di correlazione per il tracciamento distribuito
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(`API spedizione ha restituito ${response.status}: ${errorBody}`);
    }

    const result = await response.json();
    console.log(`Spedizione creata: ${result.shipment_id} (correlazione: ${correlationId})`);
    return result;
  } catch (err) {
    console.error(`[correlazione:${correlationId}] Spedizione fallita: ${err.message}`);
    throw err;
  }
}

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

Generazione UUID dalla riga di comando

Non hai sempre bisogno di uno script. Node.js può generare un UUID direttamente dalla riga di comando, il che è comodo per script shell, pipeline CI e test ad hoc rapidi. Il flag -evaluta una singola espressione.

bash — genera UUID dalla riga di comando
# UUID singolo
node -e "console.log(crypto.randomUUID())"
# 3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f

# Cinque UUID contemporaneamente
node -e "for(let i=0;i<5;i++) console.log(crypto.randomUUID())"

# Genera e assegna a una variabile shell
export REQUEST_ID=$(node -e "process.stdout.write(crypto.randomUUID())")
echo "Request ID: $REQUEST_ID"

# Usa npx uuid (se hai il pacchetto installato globalmente o vuoi un utilizzo una tantum)
npx uuid v4
# 1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed
bash — genera UUID nella console del browser (senza Node.js)
# Apri la console DevTools di qualsiasi browser e digita:
crypto.randomUUID()
# "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"
Nota:Se hai bisogno di UUID in una pipeline CI e Node.js non è disponibile, uuidgen è preinstallato su macOS e sulla maggior parte delle distribuzioni Linux. Genera UUID v4 per impostazione predefinita sui sistemi moderni.

Alternativa ad alte prestazioni — nanoid

Se stai generando migliaia di ID al secondo e il formato UUID a 36 caratteri non è un requisito obbligatorio, considera nanoid. È 2x più veloce di uuid.v4(), produce un ID URL-safe a 21 caratteri per impostazione predefinita e pesa circa 1 KB dopo la minificazione. L'output non è un UUID — è un ID con alfabeto personalizzato — quindi non usarlo dove è richiesta la conformità RFC 4122 (colonne UUID del database, API che validano il formato UUID, ID di traccia OpenTelemetry). Ma per ID di correlazione interni, chiavi di componenti React e slug URL, è una buona scelta.

bash — installa nanoid
npm install nanoid
JavaScript — nanoid per ID univoci brevi
import { nanoid, customAlphabet } from 'nanoid';

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

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

// Alfabeto personalizzato — solo numeri, 12 cifre
const numericId = customAlphabet('0123456789', 12);
console.log(numericId());
// "839274651023"

// Alfabeto personalizzato — solo esadecimale, 32 char (stessa entropia di UUID v4 senza trattini)
const hexId = customAlphabet('0123456789abcdef', 32);
console.log(hexId());
// "4f8a1b2c3d7e9f0a5b6c8d1e2f3a4b5c"

Output terminale con syntax highlighting

Il debug di applicazioni con molti UUID significa fissare pareti di stringhe esadecimali nel terminale. La codifica a colori aiuta. La libreria chalk (o il più recente node:util styleText integrato in Node.js 21.7+) ti permette di evidenziare gli UUID nell'output dei log in modo che risaltino dal testo circostante.

Node.js — output UUID a colori con 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",...}
Attenzione:I codici di escape dei colori corrompono i file di log e rompono i parser JSON. Usa chalk o styleText solo per l'output del terminale letto direttamente da un essere umano. Per i log strutturati che vanno in un file o in un aggregatore di log, usa JSON semplice.

Genera ID univoci brevi in JavaScript

Un UUID a 36 caratteri è a volte troppo lungo — slug URL, dati per codici QR, messaggi SMS e protocolli hardware incorporati hanno tutti vincoli di lunghezza.

JavaScript — tre tecniche per ID più brevi
import { randomUUID } from 'node:crypto';

// 1. Rimuovi i trattini dall'UUID v4 → stringa esadecimale a 32 char
const hex32 = randomUUID().replaceAll('-', '');
console.log(hex32);
// "3e7f1a924b0c4d8e9f127a6b3c8d5e1f" (32 char)

// 2. Codifica Base64 16 byte casuali → stringa a 22 char (URL-safe)
const bytes = new Uint8Array(16);
crypto.getRandomValues(bytes);
const base64Id = Buffer.from(bytes)
  .toString('base64url')
  .replace(/=+$/, '');
console.log(base64Id);
// "Pj8akksNTY6fEnarPIvR" (22 char, 128 bit di entropia)

// 3. nanoid con lunghezza personalizzata
import { nanoid } from 'nanoid';
const short12 = nanoid(12);
console.log(short12);
// "V1StGXR8_Z5j" (12 char, ~71 bit di entropia)

La matematica della probabilità di collisione: un nanoid a 12 caratteri (alfabeto predefinito di 64 caratteri) fornisce circa 71 bit di entropia. A 1.000 ID al secondo, ci vorrebbero circa 116 anni per raggiungere una probabilità di collisione dell'1%. Per la maggior parte delle applicazioni, è più che sufficiente. Se stai generando milioni di ID al giorno, rimani con l'UUID completo o usa nanoid con almeno 21 caratteri.

UUID v7 — Alternativa a v4 ordinata per tempo

UUID v7 (definito in RFC 9562) incorpora un timestamp Unix in millisecondi a 48 bit nel primo segmento, seguito da bit casuali. Il risultato è un UUID che sembra simile a v4 ma si ordina cronologicamente. Questo lo rende una scelta migliore rispetto a v4 per le chiavi primarie del database: le nuove righe atterrano sempre alla fine dell'indice B-tree invece di in posizioni casuali, il che riduce le divisioni di pagina e la frammentazione. Nei progetti dove ho bisogno di ID ordinati per tempo per una tabella Postgres, passo immediatamente a v7 — la differenza di prestazioni dell'indice è misurabile su scala. Il Generatore UUID v7 su ToolDeck mostra il timestamp incorporato per qualsiasi UUID v7.

JavaScript — UUID v7 con il pacchetto uuid
import { v7 as uuidv7 } from 'uuid';

// Genera tre valori UUID v7 — nota che si ordinano cronologicamente
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"

// Si ordinano lessicograficamente per tempo di creazione
console.log([id3, id1, id2].sort());
// [id1, id2, id3] — ordine cronologico preservato

// Usa v4 per token dove il tempo non dovrebbe essere rivelato
import { v4 as uuidv4 } from 'uuid';
const sessionToken = uuidv4(); // completamente casuale, nessuna info di temporizzazione
Nota:Il pacchetto uuid supporta v7 dalla versione 9.0.0 in poi. Se sei su una versione precedente, esegui npm install uuid@latest per aggiornare.

UUID v4 nel browser senza build step

Nessun bundler, nessun npm, nessun transpiler. Solo un semplice file HTML. Questo è il modo più semplice possibile per generare un UUID in JavaScript lato client. Funziona perché crypto.randomUUID() è un'API del browser integrata.

HTML — generatore UUID minimale per browser
<!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>
    // Genera uno al caricamento della pagina
    document.getElementById('output').textContent = crypto.randomUUID();
  </script>
</body>
</html>

È l'intero file. Nessun import CDN, nessun tag script che carica librerie. Per qualcosa di più complesso — generazione in batch, validazione, ID deterministici — vorrai il pacchetto uuid o il fallback manuale mostrato in precedenza. Ma per un prototipo rapido o uno strumento interno, questo è tutto ciò di cui hai bisogno.

Errori comuni

Ho visto il pattern UUID con Math.random() copiato da vecchi post di blog nel codice di produzione più spesso di quanto vorrei ammettere. I bug che questi pattern introducono sono silenziosi: nessun errore di runtime, solo un comportamento sottilmente sbagliato che emerge in seguito sotto carico o durante le revisioni di sicurezza.

Usare Math.random() per generare UUID

Problema: Math.random() non è crittograficamente sicuro. Il suo output è prevedibile in alcuni motori, e la bassa entropia rende le collisioni molto più probabili rispetto a un CSPRNG corretto.

Soluzione: Usa sempre crypto.randomUUID() o crypto.getRandomValues(). Entrambi usano il CSPRNG del sistema operativo.

Before · JavaScript
After · JavaScript
// INSICURO — prevedibile, bassa entropia
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);
    }
  );
}
// SICURO — usa il CSPRNG del sistema operativo
const id = crypto.randomUUID();

// Oppure se hai bisogno di un fallback manuale:
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('')}`;
}
Confrontare UUID con uguaglianza case-sensitive

Problema: crypto.randomUUID() restituisce esadecimale minuscolo, ma gli UUID provenienti da altri sistemi (database, API, input utente) potrebbero usare maiuscole. Il confronto diretto con === fallisce quando i casi differiscono.

Soluzione: Normalizza entrambi i lati in minuscolo prima di confrontare.

Before · JavaScript
After · JavaScript
const fromApi = "9B1DEB4D-3B7D-4BAD-9BDD-2B0D7B3DCB6D"; // maiuscolo dall'API
const local  = "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d";  // minuscolo da crypto

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

if (fromApi.toLowerCase() === local.toLowerCase()) {
  // corrisponde correttamente
}
Memorizzare UUID come oggetti invece che come stringhe

Problema: Alcune librerie UUID (soprattutto in altri linguaggi) restituiscono oggetti UUID. In JavaScript, avvolgere accidentalmente una stringa UUID in un oggetto rompe i controlli di uguaglianza, la serializzazione JSON e le query al database.

Soluzione: Memorizza e passa sempre gli UUID come stringhe semplici. Se una libreria restituisce un oggetto, chiama .toString() o accedi alla proprietà stringa immediatamente.

Before · JavaScript
After · JavaScript
// Creazione di un wrapper non necessario
class UUID {
  constructor(value) { this.value = value; }
}
const id = new UUID(crypto.randomUUID());
console.log(id === id); // true, ma...
console.log(JSON.stringify({ id })); // {"id":{"value":"..."}}
// Usa semplicemente una stringa
const id = crypto.randomUUID();
console.log(JSON.stringify({ id }));
// {"id":"3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f"}
Trattare UUID v4 come ordinabile

Problema: UUID v4 è completamente casuale. Ordinare per UUID v4 dà un ordine arbitrario, non l'ordine di creazione. Questo porta a paginazione imprevedibile, UI di amministrazione confuse e scarse prestazioni degli indici del database.

Soluzione: Usa UUID v7 quando hai bisogno di identificatori ordinati per tempo. Mantieni UUID v4 per token e ID di correlazione dove l'ordine di ordinamento è irrilevante.

Before · JavaScript
After · JavaScript
// Sbagliato: usare v4 come chiave primaria ordinabile
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));
// L'ordine di ordinamento è casuale — NON per data di creazione
import { v7 as uuidv7 } from 'uuid';
// Corretto: v7 si ordina per tempo di creazione
const rows = [
  { id: uuidv7(), created: "2026-03-27" },
  { id: uuidv7(), created: "2026-03-26" },
];
rows.sort((a, b) => a.id.localeCompare(b.id));
// L'ordine di ordinamento corrisponde al tempo di creazione

crypto.randomUUID() vs uuid vs nanoid — Confronto rapido

Metodo
Formato output
Versioni UUID
Dimensione bundle
Tipi personalizzati
Richiede installazione
crypto.randomUUID()
UUID v4 a 36 char
solo v4
0 KB
N/A
No (integrato)
pacchetto uuid npm
UUID a 36 char
v1, v3, v4, v5, v6, v7
~6.5 KB
N/A
npm install
nanoid
ID URL-safe a 21 char
Personalizzato (non UUID)
~1 KB
N/A
npm install
getRandomValues manuale
UUID v4 a 36 char
solo v4
0 KB
N/A
No (integrato)
crypto.randomBytes (Node)
Buffer → UUID v4 a 36 char
solo v4
0 KB
N/A
No (integrato in Node)
pacchetto uuidv7 npm
UUID v7 a 36 char
solo v7
~2 KB
N/A
npm install

Per la maggior parte dei progetti JavaScript: usa crypto.randomUUID() quando hai bisogno solo di UUID v4 e il tuo runtime è abbastanza recente. Usa il pacchetto uuid quando hai bisogno del supporto per v5 (deterministico) o v7 (ordinato per tempo). Usa nanoid quando un ID breve e URL-safe è più pratico di un UUID a 36 caratteri — ma ricorda che l'output di nanoid non è conforme a UUID e fallirà la validazione su qualsiasi sistema che si aspetta il formato RFC 4122.

Per un'alternativa senza codice, prova il Generatore UUID v4 per creare identificatori istantaneamente nel browser. Per ispezionare un UUID esistente, incollalo nel UUID Decoder per vedere la sua versione, variante e qualsiasi dato di timestamp incorporato.

Domande frequenti

Come si genera un UUID v4 in JavaScript?

Chiama crypto.randomUUID() in qualsiasi browser moderno (Chrome 92+, Firefox 95+, Safari 15.4+) o Node.js 19+. Restituisce una stringa minuscola come "3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f". Non è necessario alcun import nei browser perché crypto è un globale integrato; in Node.js puoi anche usare import { randomUUID } from "node:crypto" per essere esplicito sul modulo. Per i runtime precedenti a Node.js 19 puoi comunque chiamare crypto.randomUUID() sul globale — era disponibile in modo sperimentale da Node.js 14.17.0. Se hai bisogno di un'opzione senza codice, il Generatore UUID v4 su /en/uuid/v4 produce identificatori conformi con un solo clic.

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

crypto.randomUUID() è crittograficamente sicuro?

Sì. crypto.randomUUID() utilizza lo stesso CSPRNG (generatore di numeri pseudo-casuali crittograficamente sicuro) che alimenta crypto.getRandomValues(). I 122 bit casuali in un UUID v4 rendono la probabilità di collisione trascurabile per tutti gli scopi pratici — dovresti generare circa 2,71 quintilioni di UUID prima di raggiungere il 50% di probabilità di una singola collisione. L'entropia proviene dalla sorgente casuale del sistema operativo (/dev/urandom su Linux, BCryptGenRandom su Windows), non da Math.random(), che esplicitamente non è crittograficamente sicuro. Ciò significa che i valori UUID v4 sono sicuri da usare come token di sessione, token CSRF e altri identificatori sensibili alla sicurezza dove la prevedibilità deve essere evitata. Non sostituire mai i generatori UUID basati su Math.random() in contesti di sicurezza.

Posso usare UUID v4 come chiave primaria del database?

Puoi, ma c'è un compromesso significativo sulle prestazioni. UUID v4 è completamente casuale, quindi gli indici B-tree si frammentano gravemente perché ogni nuova riga si inserisce in una posizione casuale nell'indice anziché alla fine. Nelle tabelle con molte scritture questo causa eccessive divisioni di pagina e cache miss, che degradano le prestazioni di INSERT e di scansione per intervallo. Se il tuo database lo supporta (PostgreSQL, MySQL 8.0+, SQL Server), UUID v7 (ordinato per tempo) è una chiave primaria migliore perché le nuove righe si appendono sempre vicino alla fine dell'indice. UUID v4 rimane la scelta giusta per token di sessione, parametri di stato OAuth, chiavi di idempotenza, ID di correlazione e qualsiasi campo in cui nascondere il tempo di creazione è desiderabile.

JavaScript
// UUID v4 — casuale, non ordinabile
const correlationId = crypto.randomUUID();

// UUID v7 — ordinato per tempo, migliore per chiavi primarie DB
import { v7 as uuidv7 } from 'uuid';
const rowId = uuidv7();

Qual è la differenza tra UUID v4 e UUID v7?

UUID v4 riempie 122 bit con dati casuali — ogni segmento è essenzialmente rumore. UUID v7 (RFC 9562, pubblicato nel 2024) codifica un timestamp Unix in millisecondi a 48 bit nel primo segmento, 12 bit di precisione sub-millisecondo nel secondo segmento, e bit casuali nel resto. Entrambi sono 128 bit totali e usano lo stesso formato con trattini a 36 caratteri, quindi sono intercambiabili a livello di storage. UUID v7 è ordinabile lessicograficamente per tempo di creazione, il che mantiene compatti gli indici B-tree e rende efficienti le query per intervalli di tempo. Scegli UUID v4 quando l'ID non deve rivelare quando è stato creato — ad esempio, token pubblici dove le informazioni di temporizzazione potrebbero essere sfruttate — e UUID v7 per chiavi primarie di database, log di audit e flussi di eventi dove l'ordine cronologico è importante.

Come si valida una stringa UUID v4 in JavaScript?

Testa contro la regex /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i. Il letterale "4" in posizione 15 (con indice 0) conferma il nibble di versione; il carattere in posizione 20 — uno tra 8, 9, a, o b — codifica i bit di variante RFC 4122. Questa regex rifiuta correttamente UUID v1, v7 e qualsiasi stringa malformata. Il flag i la rende case-insensitive, quindi le cifre esadecimali maiuscole provenienti da altri sistemi superano la validazione senza normalizzazione. Se hai bisogno solo di sapere se una stringa è un UUID valido qualsiasi (indipendentemente dalla versione), usa invece il pattern più generico /^[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

Come si genera un ID univoco breve in JavaScript?

Rimuovi i trattini da un UUID v4 per ottenere una stringa esadecimale a 32 caratteri: crypto.randomUUID().replaceAll("-", ""). Per qualcosa di ancora più breve, usa nanoid che produce un ID URL-safe a 21 caratteri (A–Z, a–z, 0–9, _ e -) per impostazione predefinita con una resistenza alle collisioni comparabile a un UUID completo. Il compromesso è semplice: gli ID più corti hanno una maggiore probabilità di collisione, ma nanoid a 21 caratteri fornisce ancora 126 bit di entropia, più che sufficiente per praticamente ogni applicazione del mondo reale. Per slug URL e payload di codici QR puoi arrivare fino a 10–12 caratteri con nanoid prima che la probabilità di collisione diventi un problema alle tipiche frequenze di generazione. Evita di codificare in Base64 un UUID grezzo e troncarlo — il troncamento distrugge l'indipendenza statistica dei bit e rende le collisioni più difficili da ragionare.

JavaScript
// Stringa esadecimale a 32 char da UUID v4
const hexId = crypto.randomUUID().replaceAll('-', '');
// "3e7f1a924b0c4d8e9f127a6b3c8d5e1f"

// ID URL-safe a 21 char tramite nanoid
import { nanoid } from 'nanoid';
const shortId = nanoid();
// "V1StGXR8_Z5jdHi6B-myT"

Strumenti correlati

Disponibile anche in: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 WebbRevisore tecnico

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.