Un GUID è unico al 100% delle volte?
Rimarrà unico su più thread?
Un GUID è unico al 100% delle volte?
Rimarrà unico su più thread?
Risposte:
Sebbene non sia garantito che ciascun GUID generato sia univoco, il numero totale di chiavi univoche (2 128 o 3,4 × 10 38 ) è così elevato che la probabilità che lo stesso numero venga generato due volte è molto piccola. Ad esempio, considera l'universo osservabile, che contiene circa 5 × 10 22 stelle; ogni stella potrebbe quindi avere 6,8 × 10 15 GUID universalmente unici.
Da Wikipedia .
Questi sono alcuni buoni articoli su come viene realizzato un GUID (per .NET) e su come ottenere la stessa guida nella giusta situazione.
https://ericlippert.com/2012/04/24/guid-guide-part-one/
https://ericlippert.com/2012/04/30/guid-guide-part-two/
https://ericlippert.com/2012/05/07/guid-guide-part-three/
2^128
scritto fuori è di circa: 34,028,236,692,093,846,346,337,460,743,177,000,000
. Statisticamente, se calcolassi 1000 GUID al secondo, occorrerebbero comunque trilioni di anni per ottenere un duplicato.
Se hai paura degli stessi valori GUID, mettine due uno accanto all'altro.
Guid.NewGuid().ToString() + Guid.NewGuid().ToString();
Se sei troppo paranoico, mettine tre.
999999999
nella tua forma, penso che Paranoia farà esplodere il mio browser.
La semplice risposta è sì.
Raymond Chen ha scritto un ottimo articolo sui GUID e sul perché le sottostringhe dei GUID non sono garantite come uniche. L'articolo approfondisce il modo in cui i GUID vengono generati e i dati che usano per garantire unicità, che dovrebbe andare oltre spiegando perché sono :-)
Come nota a margine, stavo giocando con i GUID del volume in Windows XP. Questo è un layout di partizione molto oscuro con tre dischi e quattordici volumi.
\\?\Volume{23005604-eb1b-11de-85ba-806d6172696f}\ (F:)
\\?\Volume{23005605-eb1b-11de-85ba-806d6172696f}\ (G:)
\\?\Volume{23005606-eb1b-11de-85ba-806d6172696f}\ (H:)
\\?\Volume{23005607-eb1b-11de-85ba-806d6172696f}\ (J:)
\\?\Volume{23005608-eb1b-11de-85ba-806d6172696f}\ (D:)
\\?\Volume{23005609-eb1b-11de-85ba-806d6172696f}\ (P:)
\\?\Volume{2300560b-eb1b-11de-85ba-806d6172696f}\ (K:)
\\?\Volume{2300560c-eb1b-11de-85ba-806d6172696f}\ (L:)
\\?\Volume{2300560d-eb1b-11de-85ba-806d6172696f}\ (M:)
\\?\Volume{2300560e-eb1b-11de-85ba-806d6172696f}\ (N:)
\\?\Volume{2300560f-eb1b-11de-85ba-806d6172696f}\ (O:)
\\?\Volume{23005610-eb1b-11de-85ba-806d6172696f}\ (E:)
\\?\Volume{23005611-eb1b-11de-85ba-806d6172696f}\ (R:)
| | | | |
| | | | +-- 6f = o
| | | +---- 69 = i
| | +------ 72 = r
| +-------- 61 = a
+---------- 6d = m
Non è che i GUID siano molto simili, ma il fatto che tutti i GUID contengano la stringa "mario". È una coincidenza o c'è una spiegazione dietro questo?
Ora, quando ho cercato su Google per la parte 4 nel GUID ho trovato circa 125.000 hit con i GUID di volume.
Conclusione: quando si tratta di GUID del volume non sono così unici come altri GUID.
msiexec
, vengono elencati tutti i GUID MSI del programma Office. Tutti si incantano 0FF1CE
. Sembra che Microsoft abbia un'interpretazione abbastanza ... libera di come generare un GUID;)
0FF1CE
GUID rientrano nella sezione "Compatibilità con le versioni precedenti NCS" di RFC-4122, ma è improbabile che Microsoft stia seguendo le regole NCS per tali valori.
Non dovrebbe succedere. Tuttavia, quando .NET è sottoposto a un carico pesante, è possibile ottenere guide duplicate. Ho due diversi server Web che utilizzano due diversi server SQL. Sono andato a unire i dati e ho scoperto che avevo 15 milioni di guide e 7 duplicati.
Guid.NewGuid
genera sempre GUID v4 (e ha sempre). Tim deve aver avuto fonti di entropia estremamente povere.
Sì, un GUID dovrebbe essere sempre unico. Si basa sia sull'hardware che sul tempo, oltre a qualche bit in più per assicurarsi che sia unico. Sono sicuro che teoricamente è possibile finire con due identici, ma estremamente improbabili in uno scenario del mondo reale.
Ecco un ottimo articolo di Raymond Chen su Guids:
https://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx
Le guide sono statisticamente uniche. Le probabilità di due client diversi che generano lo stesso Guid sono infinitamente piccole (supponendo che non vi siano errori nel codice di generazione Guid). Potresti anche preoccuparti del glitch del tuo processore a causa di un raggio cosmico e decidere che 2 + 2 = 5 oggi.
Più thread che assegnano nuove guide otterranno valori univoci, ma dovresti ottenere che la funzione che stai chiamando è thread-safe. In quale ambiente si trova?
Eric Lippert ha scritto una serie molto interessante di articoli sui GUID.
Ci sono nell'ordine 2 30 personal computer nel mondo (e ovviamente molti dispositivi portatili o dispositivi informatici non PC che hanno più o meno gli stessi livelli di potenza di calcolo, ma lasciano ignorare quelli). Supponiamo che mettiamo tutti quei PC nel mondo al compito di generare GUID; se ognuno può generare, ad esempio, 2 20 GUID al secondo, quindi dopo solo circa 2 72 secondi - centocinquanta trilioni di anni - avrai un'altissima probabilità di generare una collisione con il tuo GUID specifico. E le probabilità di collisione diventano piuttosto buone dopo solo trenta trilioni di anni.
Teoricamente no, non sono unici. È possibile generare più volte una guida identica. Tuttavia, le probabilità che ciò accada sono così basse che si può presumere che siano uniche.
Ho già letto che le probabilità sono così basse che dovresti davvero sottolineare qualcos'altro - come il tuo server che combatte spontaneamente o altri bug nel tuo codice. Cioè, supponiamo che sia univoco e non incorporare alcun codice per "catturare" i duplicati: trascorri il tuo tempo in qualcosa di più probabile che accada (cioè qualsiasi altra cosa ).
Ho tentato di descrivere l'utilità dei GUID al pubblico del mio blog (membri della famiglia non tecnici). Da lì (tramite Wikipedia), le probabilità di generare un GUID duplicato:
Nessuno sembra menzionare l'effettiva matematica della probabilità che si verifichi.
Innanzitutto, supponiamo di poter utilizzare l'intero spazio a 128 bit (Guid v4 utilizza solo 122 bit).
Sappiamo che la probabilità generale di NON ottenere un duplicato nelle n
scelte è:
(1-1 / 2 128 ) (1-2 / 2 128 ) ... (1- (n-1) / 2 128 )
Poiché 2 128 è molto più grande di n
, possiamo approssimare questo a:
(1-1 / 2 128 ) n (n-1) / 2
E poiché possiamo supporre che n
sia molto più grande di 0, possiamo approssimare che a:
(1-1 / 2 128 ) n ^ 2/2
Ora possiamo equiparare questo alla probabilità "accettabile", diciamo l'1%:
(1-1 / 2 128 ) n ^ 2/2 = 0,01
Che risolviamo n
e otteniamo:
n = sqrt (2 * log 0,01 / log (1-1 / 2 128 ))
Quale Wolfram Alpha diventa 5,598318 × 10 19
Per mettere quel numero in prospettiva, prendiamo 10000 macchine, ognuna con una CPU a 4 core, facendo 4Ghz e spendendo 10000 cicli per generare un Guid e non fare nient'altro. Ci vorrebbero quindi ~ 111 anni prima di generare un duplicato.
Da http://www.guidgenerator.com/online-guid-generator.aspx
Che cos'è un GUID?
GUID (o UUID) è un acronimo di "Identificatore univoco globale" (o "Identificatore univoco universale"). È un numero intero a 128 bit utilizzato per identificare le risorse. Il termine GUID viene generalmente utilizzato dagli sviluppatori che lavorano con le tecnologie Microsoft, mentre UUID viene utilizzato ovunque.
Quanto è unico un GUID?
128 bit è abbastanza grande e l'algoritmo di generazione è abbastanza unico che se 1 milione e 1.000.000 di GUID al secondo fossero generati per 1 anno la probabilità di un duplicato sarebbe solo del 50%. O se ogni essere umano sulla Terra generasse 600.000.000 di GUID ci sarebbe solo una probabilità del 50% di un duplicato.
Ho riscontrato un GUID duplicato.
Uso lo scanner desktop Neat Receipts e viene fornito con un software di database proprietario. Il software ha una funzione di sincronizzazione con il cloud e ho continuato a ricevere un errore durante la sincronizzazione. Uno sguardo ai tronchi ha rivelato la linea fantastica:
"errori": [{"codice": 1, "messaggio": "creator_guid: is già ripreso", "guid": "C83E5734-D77A-4B09-B8C1-9623CAC7B167"}]}
Ero un po 'incredulo, ma sicuramente abbastanza, quando ho trovato un modo nel mio database neatworks locale e cancellato il record contenente quel GUID, l'errore ha smesso di verificarsi.
Quindi, per rispondere alla tua domanda con prove aneddotiche, no. Un duplicato è possibile. Ma è probabile che la ragione per cui è accaduto non fosse dovuta al caso, ma a causa della pratica standard non rispettata in alcun modo. (Non sono così fortunato) Tuttavia, non posso dirlo con certezza. Non è il mio software.
Il loro supporto clienti è stato ESTREMAMENTE cortese e disponibile, ma non hanno mai riscontrato questo problema prima perché dopo 3+ ore al telefono con loro, non hanno trovato la soluzione. (FWIW, sono molto colpito da Neat, e questo problema tecnico, per quanto frustrante, non ha cambiato la mia opinione sul loro prodotto.)
MSDN :
C'è una probabilità molto bassa che il valore del nuovo Guid sia pari a zero o uguale a qualsiasi altro Guid.
Se l'orologio di sistema è impostato correttamente e non si è spostato e se la scheda di rete ha il proprio MAC (ovvero non è stato impostato un MAC personalizzato) e il fornitore della scheda di rete non ha riciclato i MAC (cosa che non dovrebbero fare ma è noto che si verifica) e se la funzione di generazione GUID del sistema è implementata correttamente, il sistema non genererà mai GUID duplicati.
Se tutti coloro che stanno generando GUID seguono queste regole, i tuoi GUID saranno univoci a livello globale.
In pratica, il numero di persone che infrangono le regole è basso e è improbabile che i loro GUID "scappino". I conflitti sono statisticamente improbabili.
Un GUID è unico al 100% delle volte?
Non garantito, poiché esistono diversi modi per generarne uno. Tuttavia, puoi provare a calcolare la possibilità di creare due GUID identici e ottieni l'idea: un GUID ha 128 bit, quindi ci sono 2 128 GUID distinti, molto più di quanto ci siano stelle nell'universo noto. Leggi l' articolo di Wikipedia per maggiori dettagli.
In senso più generale, questo è noto come "problema del compleanno" o "paradosso del compleanno". Wikipedia ha una buona panoramica su: Wikipedia - Compleanno Problema
In termini molto approssimativi, la radice quadrata della dimensione del pool è una approssimazione approssimativa di quando ci si può aspettare una probabilità del 50% di un duplicato. L'articolo include una tabella di probabilità delle dimensioni del pool e varie probabilità, inclusa una riga per 2 ^ 128. Quindi, per una probabilità dell'1% di collisione, ti aspetteresti di scegliere casualmente numeri 2.6 * 10 ^ 18 a 128 bit. Una probabilità del 50% richiede 2,2 * 10 ^ 19 scelte, mentre SQRT (2 ^ 128) è 1,8 * 10 ^ 19.
Naturalmente, questo è solo il caso ideale di un processo veramente casuale. Come altri hanno già detto, molto sta cavalcando quell'aspetto casuale - quanto è buono il generatore e il seme? Sarebbe bello se ci fosse un po 'di supporto hardware per aiutare con questo processo che sarebbe più a prova di proiettile, tranne per il fatto che qualsiasi cosa può essere falsificata o virtualizzata. Ho il sospetto che questo potrebbe essere il motivo per cui gli indirizzi MAC / i timestamp non sono più incorporati.
Per ottenere risultati migliori, il modo migliore è aggiungere il GUID con il timestamp (solo per assicurarsi che rimanga unico)
Guid.NewGuid().ToString() + DateTime.Now.ToString();
Gli algoritmi GUID sono generalmente implementati secondo la specifica GUID v4, che è essenzialmente una stringa pseudo-casuale. Purtroppo, questi rientrano nella categoria di "probabilmente non unico" , da Wikipedia (non so perché così tante persone ignorino questo bit): "... altre versioni GUID hanno proprietà e probabilità di unicità diverse, che vanno dall'unicità garantita alla probabile non unicità ".
Le proprietà pseudo-casuali del JavaScript di V8 Math.random()
sono TERRIBILI all'unicità, con le collisioni spesso dopo poche migliaia di iterazioni, ma V8 non è l'unico colpevole. Ho visto collisioni GUID del mondo reale utilizzando entrambe le implementazioni PHP e Ruby dei GUID v4.
Poiché sta diventando sempre più comune ridimensionare la generazione di ID su più client e cluster di server, l'entropia subisce un grande successo: le probabilità che lo stesso seed casuale venga utilizzato per generare un escalation di ID (il tempo viene spesso utilizzato come seed casuale nei generatori pseudo-casuali) e le collisioni GUID passano da "probabilmente non univoci" a "molto probabilmente a causare molti problemi".
Per risolvere questo problema, ho deciso di creare un algoritmo ID che potesse ridimensionare in modo sicuro e offrire migliori garanzie contro la collisione. Lo fa utilizzando il timestamp, un contatore client in memoria, l'impronta digitale del client e caratteri casuali. La combinazione di fattori crea una complessità additiva particolarmente resistente alle collisioni, anche se la ridimensionate su un numero di host:
Ho riscontrato che i GUID non sono unici durante i test unitari multi-thread / multi-processo (anche?). Immagino che abbia a che fare con tutte le altre cose uguali, lo stesso seeding (o mancanza di seeding) di generatori pseudo casuali. Lo stavo usando per generare nomi di file univoci. Ho scoperto che il sistema operativo è molto meglio nel farlo :)
Chiedete se i GUID sono unici al 100%. Dipende dal numero di GUID di cui deve essere unico. Man mano che il numero di GUID si avvicina all'infinito, la probabilità di GUID duplicati si avvicina al 100%.
La risposta di "Is GUID è unica al 100%?" è semplicemente "No" .
Se si desidera il 100% di unicità del GUID, procedere come segue.
La parte più difficile non riguarda la generazione di una guida duplicata.
La parte più difficile è un database progettato per memorizzare tutti quelli generati per verificare se è effettivamente duplicato.
Da WIKI:
Ad esempio, il numero di UUID casuali della versione 4 che devono essere generati per avere una probabilità del 50% di almeno una collisione è di 2,71 quintilioni, calcolato come segue:
inserisci qui la descrizione dell'immagine
Questo numero equivale a generare 1 miliardo di UUID al secondo per circa 85 anni e un file contenente così tanti UUID, a 16 byte per UUID, sarebbe di circa 45 exabyte, molte volte più grande dei più grandi database attualmente esistenti, che sono attivi l'ordine di centinaia di petabyte
GUID è l'acronimo di Global Unique Identifier
In breve: (l'indizio è nel nome)
Nel dettaglio: i GUID sono progettati per essere unici; vengono calcolati utilizzando un metodo casuale basato sull'orologio e sul computer stesso, se si stanno creando molti GUID allo stesso millisecondo sullo stesso computer, è possibile che possano corrispondere, ma per quasi tutte le normali operazioni dovrebbero essere considerati unici.