Salta al contenuto principale

Generatore UUID Versione 7

UUIDv7 • Ordinato nel Tempo (RFC 9562)
00000000-0000-0000-0000-000000000000
Racchiudi:

Generazione UUID in Massa

Max 5.000
Formattazione e Struttura

Pronto

No batch active
Standard Moderno (2024)RFC 9562 Sezione 5.7

Specifiche Tecniche UUID Versione 7 (RFC 9562)

UUIDv7 combina un timestamp Unix a 48 bit (risoluzione in millisecondi) con 74 bit di entropia pseudocasuale crittografica e sequenza. Standardizzato nell'RFC 9562 (2024), risolve definitivamente i problemi di frammentazione degli indici B-Tree e il page splitting nei database causati dai tradizionali identificatori casuali UUIDv4.

Layout dei Bit e Struttura Binaria

Distribuzione dettagliata dei 128 bit secondo gli standard RFC.

Nome CampoIntervallo BitScopo e Descrizione
unix_ts_ms48 bit (0-47)Timestamp Unix Epoch in millisecondi (intero senza segno big-endian).
ver4 bit (48-51)Valore binario costante 0111 (identifica la Versione 7).
rand_a12 bit (52-63)Entropia casuale o contatore di sequenza sub-millisecondo.
var2 bit (64-65)Valore binario costante 10 (variante standard RFC 4122/9562).
rand_b62 bit (66-127)Bit di entropia pseudocasuale crittograficamente sicura (CSPRNG).

Vantaggi e Punti di Forza

  • Ordinabilità cronologica naturale; ideale per indici clustered B-Tree (PostgreSQL, MySQL, SQLite).
  • Elimina le operazioni I/O casuali su disco, i cache miss e i continui page-split durante gli inserimenti bulk.
  • 74 bit di entropia casuale per millisecondo escludono qualsiasi collisione in microservizi distribuiti.
  • Il timestamp di creazione può essere estratto direttamente dall'UUID senza interrogare il database.
!

Considerazioni e Compromessi

  • Rivela nei percorsi URL pubblici l'approssimativo timestamp di generazione (risoluzione in millisecondi).
  • Richiede una logica di contatore monotonico in caso di generazioni ad altissima frequenza nello stesso millisecondo.

Ideale per

  • Chiavi primarie per database relazionali e documentali (PostgreSQL, MySQL, CockroachDB, MongoDB).
  • Event streaming, code di messaggistica e registri di audit (Kafka, RabbitMQ, AWS SQS).
  • Database time-series e architetture orientate agli eventi.

Da evitare per

  • Token di autenticazione o session cookie segreti in cui la data di creazione deve rimanere occulta.
  • Sistemi legacy che richiedono ID sequenziali continui senza informazioni temporali.

Esempi di Implementazione del Codice

Native Node.js / BrowserTypeScript / Node.js
// Browser / Node 22+ with Web Crypto
function generateUUIDv7(): string {
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);
  const now = Date.now();

  bytes[0] = (now / 0x10000000000) & 0xff;
  bytes[1] = (now / 0x100000000) & 0xff;
  bytes[2] = (now / 0x1000000) & 0xff;
  bytes[3] = (now / 0x10000) & 0xff;
  bytes[4] = (now / 0x100) & 0xff;
  bytes[5] = now & 0xff;

  bytes[6] = (bytes[6] & 0x0f) | 0x70; // version 7
  bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant

  return [...bytes].map((b, i) =>
    (i === 4 || i === 6 || i === 8 || i === 10 ? '-' : '') + b.toString(16).padStart(2, '0')
  ).join('');
}
Python (uuid6 / 3.14+)Python
import uuid6

new_id = uuid6.uuid7()
print(new_id) # e.g. 018e6a12-8921-71e4-8a4e-128a9b345678
PostgreSQL FunctionPostgreSQL
-- PostgreSQL 13+ native UUIDv7 generator
CREATE OR REPLACE FUNCTION uuid_generate_v7()
RETURNS uuid AS $$
DECLARE
  v_time numeric = extract(epoch FROM clock_timestamp()) * 1000;
  v_bytes bytea = gen_random_bytes(16);
BEGIN
  v_bytes = set_byte(v_bytes, 0, (v_time::bigint >> 40)::int);
  v_bytes = set_byte(v_bytes, 1, (v_time::bigint >> 32)::int);
  v_bytes = set_byte(v_bytes, 2, (v_time::bigint >> 24)::int);
  v_bytes = set_byte(v_bytes, 3, (v_time::bigint >> 16)::int);
  v_bytes = set_byte(v_bytes, 4, (v_time::bigint >> 8)::int);
  v_bytes = set_byte(v_bytes, 5, (v_time::bigint)::int);
  v_bytes = set_byte(v_bytes, 6, (get_byte(v_bytes, 6) & 15) | 112);
  v_bytes = set_byte(v_bytes, 8, (get_byte(v_bytes, 8) & 63) | 128);
  RETURN encode(v_bytes, 'hex')::uuid;
END;
$$ LANGUAGE plpgsql VOLATILE;

Domande Frequenti

Perché passare da UUIDv4 a UUIDv7?
UUIDv4 causa scritture casuali negli indici B-Tree, portando a una pesante frammentazione e rallentamenti. UUIDv7 si inserisce all'estremità dell'indice, offrendo velocità di inserimento fino a 4 volte superiori.
UUIDv7 è compatibile con le colonne UUID esistenti nel mio database?
Sì. UUIDv7 condivide esattamente lo stesso formato a 128 bit (32 cifre esadecimali con 4 trattini) ed è supportato nativamente da qualsiasi colonna UUID senza migrazioni di schema.
Due UUIDv7 generati nello stesso millisecondo possono collidere?
No. Grazie ai 74 bit di entropia crittografica e sequenziamento, è possibile generare miliardi di identificatori al millisecondo con rischio di collisione nullo.