2010-04-11 13 views
5

Matematicamente suppongo che sia possibile che anche due GUID casuali generati utilizzando il metodo integrato nel framework .NET siano identici, ma approssimativamente quanto è probabile che siano in conflitto se si generano centinaia o migliaia?Quante volte è possibile generare in modo casuale un GUID prima di rischiare duplicati? (.NET)

Se ne hai generato uno per ogni copia di Windows nel mondo, si scontreranno?

Il motivo per cui lo chiedo è perché ho un programma che crea molti oggetti e ne distrugge anche alcuni, e mi chiedo sulla probabilità che uno di quegli oggetti (compresi quelli distrutti) abbia identici GUID.

+0

È possibile trovare questo rivelatore: http://weblogs.asp.net/leftslipper/archive/2010/04/01/last-guid-used-up-new-scottguid-unique-id-to-replace-it .aspx – philsquared

risposta

7

Ci sono ~ 3E38 possibili valori GUID. Ma il paradosso del compleanno taglia le probabilità 50/50 alla produzione di un GUID duplicato a ~ 1E19. Sebbene sia ancora un numero enorme, confrontando in modo abbastanza favorevole le probabilità che la tua macchina venga distrutta da un impatto con una meteora, l'orologio di sistema viene utilizzato per garantire che non si verifichino duplicati.

Molte app dbase importanti e mission critical utilizzano un GUID come chiave primaria in una tabella.Non esitate a seguire il loro esempio.

+0

Non tutti i tipi di GUID utilizzano l'orologio di sistema. Quindi una collisione è _eticamente_ possibile. – user192472

+0

I guidi non usano gli orologi, fanno i generatori di guida. Una meteora è esplosa sul Wisconsin questa settimana, piuttosto spettacolare. Mi piaceva l'opinione di mio padre su teorie del genere: "Se il cielo cade, indosseremo tutti un cappello blu". –

+0

E se si ottiene un dupe, acquistare più biglietti della lotteria – PostMan

5

Un GUID ha componenti sulla base di

  • Tempo (orologio di sistema)

  • Spazio (indirizzo del sistema MAC)

  • numeri casuali

Quindi, se uno è generato per ogni macchina nel mondo allo stesso tempo, saranno diff er dal loro MAC e numeri casuali

Ecco un link utile. http://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx

+0

Oh wow Non ho mai realizzato che fosse così complesso. Supponevo che fosse solo un grosso numero casuale;) Se i GUID sono tutti generati in un programma, presumibilmente questo rimuove la parte MAC di esso, e rimangono numeri casuali + tempo ... Ancora unici? O abbastanza unico almeno? – NibblyPig

+0

numero casuale = 7 – knoopx

+0

Non tutti i GUID hanno quella struttura, anche se sembra una scelta ragionevole. –

0

Giusto per aggiungere alla risposta giusta di Midhat, qui è una citazione dal Eric Lippert's Blog sulla situazione, in cui non v'è alcuna scheda di rete installata nel sistema (quindi, nessun indirizzo MAC):

(macchine che non avere schede di rete generano GUID speciali che si trovano in un intervallo "noto per essere potenzialmente non unico".

+4

GUID non sono stati generati utilizzando l'indirizzo MAC per un lungo periodo. Il worm Melissa si è preso cura di questo. –

+0

Oh, grazie, non ci ho pensato come vulnerabilità di sicurezza, studieremo ora wikipedia. – n535

1

È difficile calcolare le probabilità senza conoscere i dettagli interni dell'implementazione del generatore GUID.

È possibile utilizzare combinatorics per ottenere i numeri, ma ciò aiuterà solo a supporre che le combinazioni siano ugualmente probabili. Pertanto, senza alcuna conoscenza statistica dell'implementazione, sarebbe difficile dire le reali possibilità.

Contrariamente a quanto suggerisce Midhat (se l'ho capito correttamente), le collisioni GUID sono possibili. Generatori di numeri casuali incorporati vengono generalmente implementati utilizzando un seme basato sulla data/ora. Gli indirizzi MAC non sono unici per natura, in quanto possono essere sovrascritti in molte situazioni (e lo sono, almeno in alcuni casi, lo so). È possibile che due generatori GUID ottengano lo stesso input e quindi producano lo stesso output.

I GUID sono lunghi 128 bit, quindi "ce n'è abbastanza per tutti", ma ciò non garantisce che non si verifichino collisioni.

1

Dopo aver trascorso gli ultimi 25 anni di lavoro con RPC e COM (dove GUID e UUID sono critici) e lavorare con database distribuiti, dove GUID vengono utilizzati come identificatori di riga unici, non ho mai incontrato un problema di collisione - che siano generate su una singola macchina o diverse macchine. Un'altra interessante presa su questo da MSDN dove come rowids sono molto più vissuti che come oggetti: http://weblogs.asp.net/wwright/archive/2007/11/04/the-gospel-of-the-guid-and-why-it-matters.aspx

0

Questo non è qualcosa che dovrebbe essere a tutti interessato con. È solo la disponibilità euristica al lavoro. È un "rischio" di cui sei a conoscenza e che riconosci, quindi ti interessa prendertene cura. Ma ci sono molti altri rischi milioni di volte più probabili, di cui non ci preoccupiamo ancora. Il meraviglioso libro di Pro Git lo dice meglio, penso:

Una probabilità più alta esiste che ogni membro del tuo team di programmazione venga attaccato e ucciso dai lupi in incidenti non correlati nella stessa notte.

Si dovrebbe generare milioni o miliardi perché sia ​​anche una possibilità remota.

+0

è abbastanza preoccupante se si è una squadra di un uomo che lavora nella foresta profonda in una vecchia capanna di scricchiolio. – philsquared

Problemi correlati