È sicuro presumere che un GUID sarà sempre unico?


123

So che esiste una minima possibilità di conflitto, ma se generassi un batch di 1000 GUID (ad esempio), sarebbe lecito ritenere che siano tutti unici per salvare i test ciascuno?

Domanda bonus

Un modo ottimale per testare l'unicità di un GUID? Forse il filtro Bloom?



29
Non se continuiamo tutti a premere il pulsante di ricarica su questo sito: wasteaguid.info
mipadi

12
Do la colpa a tutti i miei bug sulle collisioni GUID. Deve succedere un po 'di tempo, giusto?
Michael

8
È molto più probabile che uno squalo con una bella colorazione a quadri cada dal cielo e faccia a pezzi il tuo computer, quindi suggerirei che prendere precauzioni è un'allocazione più appropriata delle risorse come parte della riduzione complessiva del rischio Piano.
David Gladfelter

4
@mipadi: ottimo collegamento! Posso solo immaginare uno sviluppatore da qualche parte che si lamenta "Guuuuys! Smettila di sprecare i GUID! Ne ho bisogno !"
FrustratedWithFormsDesigner

Risposte:


360

Si, puoi. Poiché i GUID sono lunghi 128 bit, c'è certamente una minima possibilità di scontro, ma la parola "minuto" non è neanche lontanamente abbastanza forte. Ci sono così tanti GUID che se ne generi diversi trilioni in modo casuale, hai ancora maggiori probabilità di essere colpito da un meteorite che di avere anche una sola collisione (da Wikipedia ). E se non li stai generando in modo casuale, ma ad esempio stai utilizzando l'algoritmo di indirizzo MAC e data e ora, allora saranno anche univoci, poiché gli indirizzi MAC sono unici tra i computer e i timestamp sono unici sul tuo computer.

Modifica 1: per rispondere alla tua domanda bonus, il modo ottimale per testare un insieme di GUID per l'unicità è semplicemente presumere che siano tutti unici. Perché? Perché, dato il numero di GUID che stai generando, le probabilità di una collisione GUID sono inferiori alle probabilità di un raggio cosmico che capovolge un po 'nella memoria del tuo computer e rovina la risposta data da qualsiasi algoritmo "accurato" a cui tieni correre. (Vedi questa risposta StackOverflow per la matematica.)

C'è un numero enorme di GUID là fuori. Per citare la guida galattica per autostoppisti di Douglas Adams :

"Lo spazio", dice, "è grande. Veramente grande. Semplicemente non crederai a quanto sia enormemente incredibilmente grande. Voglio dire, potresti pensare che sia una lunga strada verso il chimico, ma sono solo noccioline per lo spazio , ascolta…"

E poiché ci sono circa 7 × 10 22 stelle nell'universo , e poco meno di 2 128 GUID, allora ci sono circa 4,86 ​​× 10 15 - quasi cinque quadrilioni - GUID per ogni singola stella. Se ognuna di quelle stelle avesse un mondo con una popolazione fiorente come la nostra, allora intorno a ogni stella, ogni essere umano o alieno che sia mai vissuto avrebbe diritto a oltre quarantacinquemila GUID. Per ogni persona nella storia, per ogni stella dell'universo. Lo spazio GUID è allo stesso livello di ampiezza delle dimensioni dell'intero universo. Non non c'è bisogno di preoccuparsi.

( Modifica 2: Riflettendo su questo: wow. Non mi ero reso conto di cosa significasse. Lo spazio GUID è incomprensibilmente enorme. Ne sono in soggezione.)


1
Inoltre, WolframAlpha riferisce che, per ogni cellula di ogni persona che sia mai vissuta, ci sono 36 trilioni di UUID. Hai circa 10^14cellule nel tuo corpo e 106,5 miliardi di persone hanno mai vissuto. O, 2.385 * 10^23UUID per ogni centesimo del debito pubblico degli Stati Uniti.
123456

5
Sebbene i numeri siano ancora alti, le possibilità di una collisione GUID sono superiori al 50% a 2 ^ 64 GUID.
NullUserException

1
A 2 ^ 64 GUID, questo ridurrebbe il numero a meno di uno (0,00026) per stella nell'Universo e 2 * 10 ^ (- 15) per ogni umano o alieno che sia mai vissuto. Ciò consentirebbe comunque oltre 170 milioni di GUID per ogni essere umano che sia mai vissuto, quindi penso che siamo ancora bravi.
NullUserException

12
Vale la pena notare che una collisione GUID è anche un problema solo se si trova nello stesso spazio aziendale. Un GUID che utilizzo per identificare un componente in un software potrebbe essere lo stesso di un GUID che usi in una riga di database nella tua applicazione senza causare problemi
James Thorpe,

1
Il fatto che ci siano 2 ^ 128 GUIDS è irrilevante, e non sei "ancora bravo" con il 50% di possibilità di collisione, non sei nemmeno bravo con lo 0,0000001%
BlackTigerX

40

Risposta breve: per scopi pratici, sì.

Tuttavia, devi considerare il paradosso del compleanno!

Ho calcolato alcune probabilità di collisione rappresentative. Con UUID a 122 bit come specificato nell'articolo di Wikipedia , la probabilità di collisione è 1/2 se generi almeno 2.71492e18UUID. Con 10 ^ 19 UUID, la probabilità è 0,999918. Con 10 ^ 17 UUID, 0.000939953.

Alcuni numeri per il confronto possono essere trovati su Wikipedia. Quindi puoi assegnare in sicurezza un UUID per ogni essere umano che ha vissuto, ogni galassia nell'universo osservabile, ogni pesce nell'oceano e ogni singola formica sulla Terra. Tuttavia , le collisioni sono quasi certe se generi un UUID per ogni transistor prodotto dall'umanità in un anno, ogni insetto sulla Terra, ogni granello di sabbia sulla Terra, ogni stella nell'universo osservabile o qualsiasi cosa più grande.

Se generi 1 miliardo di UUID al secondo, ci vorranno circa 36 anni per ottenere una probabilità di collisione del 10%.

Alla fine, ci sarà probabilmente una collisione tra l'insieme di UUID generati nel corso della storia umana. Tuttavia, la probabilità che gli UUID in collisione vengano utilizzati per lo stesso scopo è incredibilmente piccola, quindi in pratica non ci sono problemi.


13
Ecco come finisce l'universo ... Alcuni programmatori presumono che i loro GUID saranno sempre unici per la loro mega Morte Nera ...
pkr298

Poiché gli UUID si basano su dati non casuali, 36 anni sono: devi preoccuparti solo di ogni millisecondo individualmente.
mjaggard

Gli UUID @mjaggard sono basati su dati casuali. Qualsiasi tipo moderno, comunque.
Trejkaz

8

Un'analisi della possibilità di collisione è disponibile su Wikipedia: http://en.wikipedia.org/wiki/Uuid#Random_UUID_probability_of_duplicates

Come accennato nel collegamento, questo sarà influenzato dalle proprietà del generatore di numeri casuali.

C'è anche la possibilità di un bug nel codice del generatore GUID; mentre le possibilità sono basse, sono probabilmente più alte delle possibilità di una collisione basate sulla matematica.

Potrebbe essere appropriato un filtro Bloom; può dirti rapidamente se un GUID è unico, ma c'è la possibilità di una falsa indicazione di una collisione. Un metodo alternativo se stai testando un batch alla volta è ordinare il batch e confrontare ogni elemento successivo.


5

In generale, sì, è lecito presumere.

Se il tuo generatore di GUID è veramente casuale, le possibilità di uno scontro all'interno di 1000 GUID sono straordinariamente piccole.

Naturalmente, ciò presuppone un buon generatore di GUID. Quindi la domanda è davvero quanto ti fidi dello strumento che stai utilizzando per generare GUID e ha i suoi test?


0

Sebbene sia possibile una collisione, è ALTAMENTE improbabile. (Matematica qui .) È lecito ritenere che siano effettivamente distinti.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.