UUID v4 vs v7 (e GUID vs UUID): quale usare | We.Inc
Come UUID v7 differisce da v4 secondo RFC 9562, perché gli ID ordinati nel tempo sono adatti alle chiavi di database, cos'è un GUID e uno strumento nel browser per creare ID v4 e v7 e decodificare il timestamp di un v7.
Entrambi sono identificatori a 128 bit scritti con 36 caratteri. Un UUID v4 è composto da 122 bit casuali, quindi i nuovi valori finiscono in un punto qualsiasi di un indice ordinato. Un UUID v7 inizia con un timestamp Unix a 48 bit in millisecondi seguito da bit casuali, quindi i valori si ordinano più o meno per momento di creazione. RFC 9562 raccomanda v7 rispetto ai più vecchi v1 e v6 basati sul tempo.
v4 e v7 a confronto
UUID v4
UUID v7
Composto da
122 bit casuali
Timestamp a 48 bit in millisecondi più 74 bit casuali
Ordinamento
Casuale
Più o meno per momento di creazione
Rivela il momento di creazione
No
Sì, al millisecondo
Integrato nei browser
crypto.randomUUID()
No, usa poche righe di codice o una libreria
Adatto per
Token, ID pubblici, tutto ciò che non deve rivelare tempistiche
Chiavi primarie di database, log, ID di eventi
Scegliere una versione di UUID è soprattutto una questione di database. Le chiavi v4 casuali sparpagliano gli inserimenti in tutto l'indice, mentre le chiavi v7 arrivano in ordine, come farebbe un numero auto-increment, senza bisogno di un contatore centrale. Genera entrambi i tipi qui sotto, poi incolla qualsiasi UUID per vederne la versione e, per v7, il momento in cui è stato creato.
Premi un pulsante di generazione per creare un nuovo UUID v4 o v7 nel tuo browser.
Copialo, o incolla qualsiasi UUID nella casella del decoder.
Il decoder legge la cifra della versione e i bit della variante e, per v7, trasforma i primi 48 bit in data e ora.
Genera qualche valore v7 di fila e nota come i primi caratteri cambiano appena.
Salva gli UUID in una colonna uuid nativa se il tuo database ne ha una. Sedici byte battono una stringa di 36 caratteri per dimensioni e confronti.
Non usare v7 dove il momento di creazione è un dato sensibile, come nei token di reimpostazione password. Chiunque abbia l'ID può leggere quando è stato creato.
crypto.randomUUID() funziona solo su pagine sicure (HTTPS o localhost). Su HTTP semplice non è disponibile.
Due ID v7 creati nello stesso millisecondo sono ordinati in base ai bit casuali, non a quale è venuto prima, a meno che la tua libreria non usi i metodi a contatore facoltativi descritti dalla RFC.
Domande frequenti
Che differenza c'è tra un GUID e un UUID?
Nessuna che conti nella pratica. RFC 9562 definisce gli UUID e precisa che sono noti anche come GUID, Globally Unique Identifiers, il nome usato dagli strumenti Microsoft. Un GUID generato da .NET o SQL Server è un UUID nello stesso formato a 36 caratteri.
UUID v7 è uno standard ufficiale?
Sì. RFC 9562, pubblicata nel 2024, definisce le versioni 6, 7 e 8 insieme a quelle più vecchie e rende obsoleta RFC 4122, il documento che prima descriveva gli UUID.
UUID v7 è abbastanza unico?
Ogni millisecondo dispone di 74 bit casuali, più che sufficienti per quasi ogni sistema. Una collisione richiederebbe un numero enorme di ID creati esattamente nello stesso millisecondo.
Posso ricavare il momento di creazione da un UUID v7?
Sì. Le prime 12 cifre hex sono il tempo Unix in millisecondi. Incollane uno nel decoder qui sopra per vederlo come data, o interpreta tu quelle cifre come numero esadecimale.
Devo convertire le chiavi v4 esistenti in v7?
Di solito no. Entrambi sono UUID validi e possono convivere nella stessa colonna, quindi le nuove righe possono usare v7 mentre quelle vecchie mantengono i valori v4. Riscrivere le chiavi primarie significa riscrivere ogni chiave esterna che punta a esse.
Perché l'ordinamento conta per i database
La maggior parte dei database tiene le chiavi primarie in un B-tree. Quando ogni nuova chiave è maggiore dell'ultima, gli inserimenti vanno in fondo all'albero e le pagine scritte di recente restano in memoria. Le chiavi casuali costringono a scrivere in pagine sparse per tutto l'albero, il che significa più split di pagina e più letture da disco man mano che la tabella cresce.
RFC 9562 cita questo problema di località tra i motivi per aggiungere versioni ordinate nel tempo, e v7 è quella che indica per i nuovi sistemi.
Leggere la struttura
Nella forma testuale, la 13ª cifra hex (la prima del terzo gruppo) è la versione, quindi un UUID v7 ha sempre un 7 in quella posizione e un v4 ha un 4. La prima cifra del quarto gruppo è 8, 9, a o b per la variante standard.
Per v7, le 12 cifre prima della versione sono il timestamp. Tutto ciò che segue la cifra della versione, a parte i due bit della variante, è casuale.
Tutte e otto le versioni di UUID
Versioni di UUID in RFC 9562
Versione
Basata su
Note
Tempo gregoriano più un ID di nodo, spesso l'indirizzo MAC
Legacy; preferisci v7
Versione DCE Security, non specificata da RFC 9562
Rara
Basata su nome, hash MD5 di un namespace e un nome
Stesso input, stesso UUID
Bit casuali o pseudocasuali
La scelta predefinita comune
Basata su nome, hash SHA-1 di un namespace e un nome
Preferita a v3
Il timestamp di v1 riordinato in modo che i valori si ordinino per tempo
Preferisci v7 per i nuovi sistemi
Tempo Unix Epoch in millisecondi più bit casuali
Chiavi ordinabili
Struttura personalizzata scelta dall'implementazione
Formati sperimentali o proprietari
Codice da copiare
UUID v4 nel browser o in Node
Integrato nei browser attuali sulle pagine sicure e in Node 19 e successivi tramite l'oggetto globale crypto. Restituisce una stringa di 36 caratteri.
UUID v7 senza libreria
Scrive l'ora corrente nei primi sei byte, poi imposta i bit di versione e variante. Il resto rimane casuale.
Leggere l'ora da un UUID v7
Le prime 12 cifre hex sono i millisecondi dal 1970, quindi interpretandole ottieni una Date.
Genera e decodifica
Genera v4
Genera v7
Generato
Premi un pulsante per creare un UUID. Viene creato nel tuo browser e non viene mai inviato da nessuna parte.
Incolla un UUID da decodificare
Versione: {v}
RFC 9562 (quella standard)
Non è la variante RFC 9562
Creato: {v} (UTC)
Questa versione non contiene un timestamp Unix.
Questo non è un UUID. Servono 32 cifre hex in gruppi da 8-4-4-4-12.