Generatore UUID
Genera un UUID o cinquecento, casuali o ordinati nel tempo, e leggi la versione di qualunque UUID incolli.
La versione 4 sono 122 bit casuali. La probabilità di una collisione resta trascurabile fino a miliardi di id, ed è il motivo per cui non serve alcun coordinamento tra macchine.
Che cos'è un UUID?
Un UUID è un identificativo da 128 bit scritto come 32 cifre esadecimali in cinque gruppi, tipo 550e8400-e29b-41d4-a716-446655440000. Si genera senza chiedere niente a un'autorità centrale ed è unico in pratica, perché i valori possibili sono così tanti che una collisione non capita.
Come funziona
Un UUID sono 128 bit scritti come 32 cifre esadecimali nella forma 8-4-4-4-12. Sei di quei bit sono fissi e registrano versione e variante, e restano 122 bit di casualità in una versione 4.
La versione 7 spende i primi 48 bit sul millisecondo Unix in cui è stata creata, poi riempie il resto di casualità. Gli id continuano a sembrare UUID qualsiasi, ma si ordinano per data di creazione, che è quello che vuole l’indice di un database.
La casualità arriva da crypto.getRandomValues, la sorgente crittografica del browser. Niente viene generato in fase di build: un id cotto dentro la pagina sarebbe lo stesso per ogni visitatore, cioè l’opposto di univoco.
Che cos’è un UUID e che cosa garantisce
Un UUID è un identificatore che puoi generare senza chiedere il permesso a nessuno. La proposta è tutta lì: nessun contatore centrale, nessun coordinamento tra server, nessun viaggio al database per sapere qual è il prossimo id. Due macchine che non si sono mai parlate possono coniare id tutto il giorno senza collidere mai, ed è questo che rende gli UUID la chiave predefinita per tutto ciò che è distribuito, funziona offline o viene unito dopo.
La garanzia è probabilistica, non assoluta. Con 122 bit casuali gli UUID versione 4 possibili sono circa 5,3×10^36; bisognerebbe generarne attorno a 2,7×10^18 prima che la probabilità di una sola collisione arrivi al 50%. A un milione di id al secondo fanno circa ottantacinquemila anni. Non è impossibile: è solo che non è mai la cosa che si rompe.
Versione 4 o versione 7
- Versione 4: casuale quella che quasi tutti intendono dicendo «un UUID». Casualità pura, nessuna informazione su quando o dove è stato creato, e quindi niente che l’id stesso riveli. La scelta predefinita per un identificatore pubblico.
- Versione 7: ordinata nel tempo prima un timestamp in millisecondi, poi la casualità. Standardizzata nella RFC 9562 nel 2024, ed è la scelta migliore per una chiave primaria.
- Perché l’ordine conta un indice B-tree scrive le righe nuove dove cade la chiave. Chiavi casuali spargono le scritture su tutto l’indice e continuano a sfrattare pagine dalla cache; chiavi ordinate nel tempo accodano in fondo. Su una tabella grande quella differenza si vede nel ritmo di inserimento e nella dimensione dell’indice.
- Cosa rivela la v7 il proprio istante di creazione, a chiunque sappia leggerla. Di solito va benissimo per una chiave interna ed è una cattiva idea per qualcosa che un estraneo può enumerare.
- Le versioni 1, 3 e 5 la v1 è tempo più indirizzo MAC della macchina, e rivela l’identità dell’hardware; la v3 e la v5 sono hash di un nome in uno spazio di nomi, per ricavare lo stesso id dallo stesso input. Qui non si generano, ma l’ispettore le legge correttamente.
I dettagli pratici che fanno male
Conservare un UUID come testo è l’errore evitabile più comune. Come stringa di 36 caratteri costa 36 byte e si confronta carattere per carattere; come 16 byte grezzi, uuid in Postgres, BINARY(16) in MySQL, costa 16 e si confronta come due parole macchina. Su una tabella da qualche milione di righe e un paio di indici la differenza si misura in gigabyte.
Maiuscole e parentesi graffe sono formattazione, non identità. 123E4567-E89B-… e 123e4567-e89b-… sono lo stesso UUID, e lo è anche lo stesso valore avvolto nelle graffe come lo scrivono gli strumenti Windows. La forma canonica nella RFC 9562 è minuscola con i trattini, quindi è quella da conservare; il resto si accetta in ingresso e si normalizza.
E il nil UUID, tutti zeri, è valido, cosa che sorprende. È un UUID legittimo con versione 0, ed è il valore che esce quando viene scritto un campo non inizializzato. Se lo trovi nei tuoi dati, qualcosa ha usato un default invece di generare.
Quando qualcosa sembra sbagliato
- Tutti gli id cominciano con gli stessi caratteri è normale nella versione 7: quel prefisso è il timestamp, condiviso da tutto ciò che è stato generato nello stesso millisecondo. Nella versione 4 vorrebbe dire sorgente casuale rotta.
- L’ispettore dice versione 0 è il nil UUID, o un valore che non è mai stato generato davvero come UUID. Controlla chi l’ha scritto.
- L’ispettore rifiuta una stringa di 32 caratteri un UUID senza trattini è un formato di archiviazione comune ma non quello canonico. Aggiungi i trattini, o incollalo in uno strumento che si aspetta la forma compatta.
- Due id sono identici in pratica significa che uno è stato copiato, o che è stato usato un generatore pseudocasuale con seme invece di uno crittografico. Math.random in un ciclo può ripetersi; getRandomValues no.
- Un database lo rifiuta di solito è una colonna CHAR(36) che riceve la forma con graffe o in maiuscolo, o una colonna uuid che riceve quella senza trattini. Normalizza prima di scrivere.
Il vocabolario vicino
- GUID il nome che Microsoft dà allo stesso identificatore da 128 bit. Stessa cosa, scrittura diversa, e storicamente dentro le graffe.
- ULID un’alternativa non standard con la stessa idea dell’ordinamento temporale, scritta in 26 caratteri base32. Leggibile e ordinabile, ma non è un UUID, quindi una colonna uuid non la accetta.
- Snowflake id un id da 64 bit con timestamp, numero di macchina e contatore. Più piccolo di un UUID e ordinabile, ma richiede numeri di macchina distribuiti centralmente.
- Variante i due bit che dichiarano quale struttura di UUID è in uso. Quella RFC 4122 è l’unica che usi tutto il moderno; l’ispettore la nomina.
- Collisione due id generati che escono identici. Per la v4 la probabilità è trascurabile: il guasto realistico è una sorgente casuale debole, non la sfortuna.
Domande frequenti
Che cos’è un UUID?
Un identificatore da 128 bit scritto come 32 cifre esadecimali nella forma 8-4-4-4-12, generato senza coordinamento. Due macchine possono coniarli in autonomia senza collidere praticamente mai.
Meglio UUID v4 o v7?
La v4 per un identificatore pubblico che non deve rivelare niente. La v7 per una chiave primaria, perché il timestamp iniziale fa accodare l’indice in fondo invece di spargere le scritture.
Due UUID possono essere uguali?
Con 122 bit casuali servirebbero circa 2,7×10^18 id prima che una collisione diventi probabile come il contrario. In pratica una ripetizione significa sorgente casuale debole, non sfortuna.
Un UUID senza trattini è valido?
Sono gli stessi 128 bit ed è un formato di archiviazione comune, ma la forma canonica della RFC 9562 è minuscola con i trattini. Conserva quella e normalizza in ingresso.
Che differenza c’è tra UUID e GUID?
Nessuna, a parte il nome. GUID è il termine di Microsoft per lo stesso identificatore, storicamente scritto tra parentesi graffe.