Sto cercando di generare ID univoci per l'identificazione di alcuni dati nel mio sistema. Sto usando un sistema elaborato che concatena alcuni (non unici, rilevanti) meta-dati con System.Guid.NewGuid() s. Ci sono degli svantaggi in questo approccio, o sono in chiaro?Ci sono degli svantaggi nel fare affidamento sulla funzione System.Guid.NewGuid() quando si cercano ID univoci per i dati?
risposta
Sto cercando di generare ID univoci per l'identificazione di alcuni dati nel mio sistema.
mi consiglia un GUID poi, dal momento che sono, per definizione, identificatori univoci globali.
Sto usando un sistema elaborato che concatena alcuni (non unici, rilevanti) metadati con System.Guid.NewGuid(). Ci sono degli svantaggi in questo approccio, o sono in chiaro?
Bene, dal momento che non sappiamo cosa si considera un inconveniente, è difficile da dire. Mi vengono in mente alcuni possibili inconvenienti:
GUID sono grandi: 128 bit sono un sacco di bit.
GUID non garantisce una distribuzione particolare; è perfettamente legale per generare GUID in modo sequenziale ed è perfettamente legale che sia distribuito uniformemente nello spazio di 124 bit (128 bit meno i quattro bit che sono ovviamente il numero di versione). Ciò può avere gravi conseguenze sul database prestazioni se il GUID viene utilizzato come chiave primaria in un database che viene indicizzato nell'ordine ordinato dal GUID; gli inserimenti sono molto più efficienti se la nuova riga va sempre alla fine. Un GUID uniformemente distribuito sarà quasi uguale a mai alla fine.
GUID versione 4 sono pseudo-casuali ma non crittograficamente casuali; un utente malintenzionato potrebbe in teoria prevedere quali sono i tuoi GUID quando viene fornito un campione rappresentativo di essi. Un utente malintenzionato potrebbe in teoria determinare la probabilità che due GUID siano stati generati nella stessa sessione. I GUID della versione uno sono ovviamente quasi casuali e possono dire al lettore sofisticato quando e dove sono stati generati.
E così via.
Sto pianificando una serie di articoli su queste e altre caratteristiche di GUID nelle prossime due settimane; guarda il mio blog per i dettagli.
Quando si utilizza System.Guid.NewGuid()
, è possibile controllare che il guid non sia già presente nel sistema.
Mentre un guid è così complesso da essere virtualmente unico, non c'è nulla che garantisca che non esiste già tranne la probabilità. È solo incredibilmente statisticamente improbabile, al punto che in ogni caso è lo stesso di essere unico.
Generare a guidi identici è come vincere la lotteria due volte - non c'è nulla che impedisca effettivamente, è così improbabile che potrebbe anche essere impossibile.
La maggior parte delle volte è probabile che tu possa scappare senza cercare partite esistenti, ma in un caso estremo con un sacco di generazione in corso, o dove il sistema non deve assolutamente fallire, potrebbe valerne la pena.
EDIT
Vorrei chiarire un po 'di più. È altamente improbabile che tu possa mai vedere una guida doppia. Questo è il punto. È "globalmente unico", nel senso che c'è una tale possibilità infinitamente di un duplicato che si può presumere che sarà unico. Tuttavia, se stiamo parlando di un codice che tiene un aereo in cielo, controlla un reattore nucleare o gestisce il supporto vitale sulla Stazione Spaziale Internazionale, personalmente, controllerei personalmente un duplicato, solo perché sarebbe davvero terribile colpire quel caso limite. Se stai semplicemente scrivendo un motore di blog, d'altra parte, vai avanti, usalo senza controllo.
Sentitevi liberi di usare NewGuid()
. Non c'è nessun problema con la sua unicità.
C'è una probabilità troppo bassa che generi lo stesso guid due volte; un bell'esempio può essere trovato qui: Simple proof that GUID is not unique
var bigHeapOGuids = new Dictionary<Guid, Guid>();
try
{
do
{
Guid guid = Guid.NewGuid();
bigHeapOGuids.Add(guid ,guid);
} while (true);
}
catch (OutOfMemoryException)
{
}
Ad un certo punto si è bloccato sulla OutOfMemory
e non sul conflitto chiave duplicata.
Questo è un cattivo esempio. Un 'HashSet' non lancia un'eccezione sull'aggiunta di un elemento duplicato, semplicemente non lo aggiunge. Ecco perché restituisce un valore booleano che indica se è stato aggiunto qualcosa. – hvd
@hvd: corretto asnwer. Metti un 'dizionario
Non che nessuno di noi si aspettasse altro, ovviamente :) – hvd
- 1. Ci sono degli svantaggi quando si usa ".on"?
- 2. Ci sono degli svantaggi per SEAM?
- 3. Ci sono degli svantaggi nell'usare channel.Get() sul canale.Consume()?
- 4. Ci sono degli svantaggi nel concatenare tutti i file JavaScript (incluso il fornitore)
- 5. Ci sono degli svantaggi usando Preparedstatement rispetto a Statement
- 6. Ci sono degli svantaggi nell'usare VARCHAR (MAX) in una tabella?
- 7. Si può fare affidamento sulla chiave primaria auto-incrementante nel proprio database?
- 8. Ci sono degli svantaggi nell'usare le istruzioni preparate?
- 9. Ci sono degli svantaggi nell'includere la libreria jquery sulla mia pagina?
- 10. CUDA: Quando utilizzare la memoria condivisa e quando fare affidamento sulla memorizzazione nella cache L1?
- 11. Gli ID filo e processo sono univoci?
- 12. Query rinviare nulla quando ci sono dati nel database
- 13. Quali svantaggi ci sono per lasciare aperta una connessione SQL?
- 14. iOS CoreData - ci sono degli svantaggi nell'abilitare il logging WAL/Write-Ahead di sqlite
- 15. Fare affidamento sull'ordine di inizializzazione
- 16. Si può fare affidamento su jQuery?
- 17. Gli ID filo sono univoci per processo o per computer?
- 18. Ci sono degli svantaggi nell'utilizzo di un certificato SSL crittografato a 4096 bit?
- 19. pulsante Rilevamento premuto quando ci sono più visualizzazioni degli avvisi
- 20. ID univoci con mongodb
- 21. In Perl ci sono degli svantaggi nel generare getter e setter invece di codificarli con hard-coding?
- 22. Interruzione di riga quando non ci sono dati in ggplot2
- 23. Ci sono degli svantaggi nell'uso di un inizializzatore di oggetti vuoto?
- 24. Ci sono degli svantaggi nell'ascoltare gli eventi a livello di documento in jQuery?
- 25. Ci sono degli effetti collaterali (negativi) quando non uso la funzione "allora" di una Promessa?
- 26. Quante versioni degli standard C++ ci sono?
- 27. ID univoci in knockout.js modelli
- 28. Ci sono funzioni per recuperare i conteggi degli istogrammi di una serie nei panda?
- 29. Ci sono (ci sono stati) sforzi per creare un linguaggio schema per formati binari arbitrari?
- 30. report Jasper esporta i dati vuoti in formato PDF quando ci sono più dati
Ho pensato che ci fosse uno spazio a 122 bit disponibile basato su questo: http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/ 8659071.aspx Sta parlando della stessa implementazione? –