Ho scritto il generatore / parser di UUID per Ruby, quindi mi considero ragionevolmente ben informato sull'argomento. Esistono quattro versioni principali di UUID:
Gli UUID della versione 4 sono essenzialmente solo 16 byte di casualità estratti da un generatore di numeri casuali crittograficamente sicuro, con alcuni bit-twiddling per identificare la versione e la variante dell'UUID. È estremamente improbabile che si scontrino, ma potrebbe accadere se viene utilizzato un PRNG o se ti capita di avere davvero, davvero, davvero, davvero, davvero sfortuna.
Gli UUID della versione 5 e della versione 3 utilizzano rispettivamente le funzioni hash SHA1 e MD5 per combinare uno spazio dei nomi con una parte di dati già univoci per generare un UUID. Ciò, ad esempio, ti consentirà di produrre un UUID da un URL. Le collisioni qui sono possibili solo se anche la funzione hash sottostante ha una collisione.
Gli UUID della versione 1 sono i più comuni. Usano l'indirizzo MAC della scheda di rete (che a meno che non sia falsificato, dovrebbe essere univoco), più un timestamp, più il solito bit-twiddling per generare l'UUID. Nel caso di una macchina che non dispone di un indirizzo MAC, i 6 byte del nodo vengono generati con un generatore di numeri casuali crittograficamente sicuro. Se due UUID vengono generati in sequenza abbastanza velocemente da far corrispondere il timestamp all'UUID precedente, il timestamp viene incrementato di 1. Le collisioni non dovrebbero verificarsi a meno che non si verifichi una delle seguenti condizioni: L'indirizzo MAC è falsificato; Una macchina che esegue due diverse applicazioni che generano UUID produce UUID nello stesso identico momento; A due macchine senza una scheda di rete o senza accesso a livello utente all'indirizzo MAC viene assegnata la stessa sequenza di nodi casuali e generano gli UUID nello stesso momento esatto;
Realisticamente, nessuno di questi eventi si verifica accidentalmente nello spazio ID di una singola applicazione. A meno che tu non accetti ID, ad esempio, su scala Internet o con un ambiente non attendibile in cui individui malintenzionati potrebbero essere in grado di fare qualcosa di male in caso di collisione di ID, non è qualcosa di cui dovresti preoccuparti. È fondamentale capire che se ti capita di generare lo stesso UUID di versione 4 come me, nella maggior parte dei casi, non importa. Ho generato l'ID in uno spazio ID completamente diverso dal tuo. La mia applicazione non saprà mai della collisione, quindi la collisione non ha importanza. Francamente, in un unico spazio applicativo senza attori malintenzionati, l'estinzione di tutta la vita sulla terra avverrà molto prima che tu abbia una collisione, anche su un UUID versione 4, anche se tu '
Inoltre, 2 ^ 64 * 16 corrisponde a 256 exabyte. Come in, dovresti memorizzare 256 exabyte di ID prima di avere il 50% di possibilità di una collisione di ID in un singolo spazio dell'applicazione.