2011-12-27 10 views
24

Eventuali duplicati:
Is a GUID unique 100% of the time?
Simple proof that GUID is not uniqueQuali sono le possibilità di ottenere un duplicato Guid.NewGuid()?

In MSDN si può leggere:

The chance that the value of the new Guid will be all zeros or equal to any other Guid is very low.

Diciamo che si dispone di un metodo che creerà un file ogni secondo, e usi il metodo Guid.NewGuid() per nome file, è possibile ottenere la stessa guida allora? O il computer locale terrà traccia in qualche modo? Quanto è bassa la possibilità?

+13

Circa 1 su 2^128. – tenfour

+0

No, il computer non tiene traccia. Ma no, le probabilità di un GUID duplicato sono così basse da non essere rilevanti. Hai già risposto alla tua domanda nella domanda; tutte le risposte ti stanno solo pappagliando. –

+0

@CodyGray specifico per il contesto dell'OP, il sistema * fa * tiene traccia. Il filesystem terrà traccia di ogni GUID che è stato usato per questo scopo e non ti permetterà di creare un file con un nome identico. Quindi, in pratica, se l'OP scrive un buon codice, la risposta è che non importa se ci sono collisioni o meno. – tenfour

risposta

15

Non resterebbero mai senza guidi. La probabilità di loro duplicazione è molto bassa:

http://betterexplained.com/articles/the-quick-guide-to-guids/

+1

Non sono d'accordo con questo, in quanto non è molto basso. Ne ho un esempio pratico, http://stackoverflow.com/questions/39771/is-a-guid-unique-100-of-the-time/21570510#21570510 – vikas

29

Le possibilità di ottenere due guidi identici sono astronomicamente sottili anche se si generano i guidi il più velocemente possibile. (Generando, per esempio, migliaia di guids al secondo al solo scopo di trovare un duplicato.)

Naturalmente, se vuoi la mia opinione, credo che ci sarà un tempo, tra un paio di migliaia di anni da ora, quando colonizzeremo la galassia, la nostra popolazione sarà tra i trilioni, e il numero di singoli computer incastonati dappertutto sarà numeroso nei miliardi, quando inizieremo a scovarci con duplicati di guidi che saltano fuori ogni tanto in aree distanti della galassia, e poi sarà come 640k di memoria tutto daccapo, l'inferno della DLL tutto da capo, il bug del millennio a due cifre tutto da capo, tutti insieme.

La cosa con GUID è che non vogliamo che siano enormi, perché in tal caso sarebbero inutili, quindi qualcuno ha dovuto inventare un numero di bit abbastanza piccolo da non essere troppo dispendioso e tuttavia di grandi dimensioni abbastanza da dare una ragionevole garanzia contro le collisioni. Quindi, è un compromesso tecnologico. Nel nostro secolo 128 bit sembrano essere un buon compromesso, ma con certezza quasi matematica ci sarà un altro secolo in cui questo compromesso non sarà più così buono.

+0

A quel punto avremo processori quantistici capaci di operazioni quanary e di veri multitasking e non penso che ci preoccuperemo più dei guids. Avremo anche Internet quantistico che utilizza Quantum Entanglement per trasmettere dati e avremo un universo che si estende su Internet con una latenza di 10 ms da qualsiasi punto a punto. È anche possibile che avremo dei dischi di curvatura (piegare lo spazio per ottenere FTL ..) –

+0

Ho paura che la nostra capacità di comunicare più rapidamente renderà le collisioni GUID solo più frequenti. –

+0

Migliaia di anni? Con il modello attuale, ci sono abbastanza GUID per adattarsi a circa 800 milioni di GUID per nanosecondo negli ultimi 13.800 miliardi di anni. Anche se riceviamo quadrilioni di computer ciascuno creando miliardi di GUID al secondo, il rischio sarà trascurabile per molto tempo. Se ci sarà davvero un giorno in cui potrebbe essere un rischio, avremmo millenni per preparare un nuovo standard con 4096 bit. –

1

Si prega di leggere la seguente questione per informazioni su collisioni: Are GUID collisions possible?

Per quanto riguarda "un guid al secondo", GUID generati di solito prendono tempo in considerazione, in modo sullo stesso computer, 0 possibilità di generare lo stesso GUID a meno si modificano le impostazioni del clock interno

modificare: a quanto pare the wikipedia page su GUID dice che il tempo non è obbligatoria quando si costruisce un GUID quindi credo che dipende l'algoritmo utilizzato. Dal momento che stiamo parlando di C# (su Windows?) È in realtà uno UUID che fa include la temporizzazione in alcune versioni.

0

Si esaurirà lo spazio su disco o si inceppa il filesystem prima che i GUID si scontrino. Basta gestire gli errori durante la creazione di file con grazia e starai bene.

8

c'è sempre qualche minuscola possibilità di duplicati, ma identificatori univoci globali sono destinate ad essere proprio questo: globalmente unica ... non-livello di sistema unico nel suo genere, ma come nel Pianeta Terra unico.

Suppongo che, teoricamente, si abbia una migliore possibilità di duplicare un UUID su più sistemi, rispetto a un singolo sistema. Mentre il sistema operativo non memorizza tutti i GUID generati, probabilmente utilizza alcuni dati seme predefiniti per evitare collisioni in sé. Naturalmente questo dipende dall'implementazione.

Oh, e le possibilità ... beh ci sono 3,4 x 10^38 disponibili, Wikipedia dice che è più probabile che venga colpito da un meteorite.

Offrirò anche un metodo alternativo, il metodo Path.GetTempFileName() potrebbe essere utile, perché ha una protezione contro la collisione ... anche se può solo creare 65.535 nomi di file univoci prima di lanciare un'eccezione se i file precedenti non sono " t cancellato.

Oltre a questo, non è molto difficile da fare:

string path; 

do 
{ 
    path = Guid.NewGuid().ToString(); // Format as needed 

} while (File.Exists(path)); 
+1

mi fa sentire meglio che se ne sia andato essere solo a livello di sistema per il pianeta terra unico !! sono comunque paranoico sul fatto che non sia sicuro al 100%.Preferirei controllare il db per vederlo esiste, ma so che questo causa un sovraccarico ... – ozzy432836

Problemi correlati