Generatore UUID Versione 7
UUIDv7 • Ordinato nel Tempo (RFC 9562)
00000000-0000-0000-0000-000000000000
Racchiudi:
Generazione UUID in Massa
0 msReady
Max 5.000
Formattazione e Struttura
Pronto
No batch active1-click copy available on each row
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 Campo | Intervallo Bit | Scopo e Descrizione |
|---|---|---|
| unix_ts_ms | 48 bit (0-47) | Timestamp Unix Epoch in millisecondi (intero senza segno big-endian). |
| ver | 4 bit (48-51) | Valore binario costante 0111 (identifica la Versione 7). |
| rand_a | 12 bit (52-63) | Entropia casuale o contatore di sequenza sub-millisecondo. |
| var | 2 bit (64-65) | Valore binario costante 10 (variante standard RFC 4122/9562). |
| rand_b | 62 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-128a9b345678PostgreSQL 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.