Esistono molti sistemi che dipendono dall'unicità di un determinato valore. Viene in mente qualsiasi cosa usi i GUID (ad esempio il registro di Windows o altri database), ma anche cose che creano un hash da un oggetto per identificarlo e quindi hanno bisogno che questo hash sia unico.Gestione di collisioni praticamente impercettibili su valori imperdibili
Una tabella hash di solito non interessa se due oggetti hanno lo stesso hash perché l'hashing è solo usato per suddividere gli oggetti in categorie, in modo che alla ricerca, non tutti gli oggetti nella tabella, ma solo quegli oggetti in la stessa categoria (bucket) deve essere confrontata per l'identità dell'oggetto ricercato.
Tuttavia, altre implementazioni (sembrano) dipendono dall'unicità. Il mio esempio (questo è quello che mi ha spinto a chiedermelo) sono gli ID di revisione di Mercurial. Un entry sulla mailing list Mercurial giustamente
Le probabilità di changeset hash collisione per caso nei vostri primi miliardi di commit è praticamente pari a zero. Ma noteremo se succede. E diventerai famoso come il ragazzo che ha rotto SHA1 per sbaglio.
Ma anche la più piccola probabilità non significa impossibile. Ora, non voglio una spiegazione del perché sia del tutto corretto fare affidamento sull'unicità (questo è stato discusso here per esempio). Questo è molto chiaro per me.
Piuttosto, mi piacerebbe sapere (forse per mezzo di esempi il proprio lavoro):
Ci sono delle migliori pratiche per coprire questi casi improbabili comunque?
Devono essere ignorati, perché è più probabile che i venti solari particolarmente forti portino a letture del disco rigido difettose?
dovrebbero almeno essere testati per, se non altro per non riuscire con un "Mi arrendo, avete fatto l'impossibile" messaggio per l'utente?
O anche questi casi devono essere gestiti con garbo?
Per me, in particolare i seguenti sono interessanti, anche se sono un po 'permaloso-feely:
Se non si gestisce questi casi, che cosa fare contro sentimenti viscerali che don' t ascoltare le probabilità?
Se li gestisci, come giustifichi questo lavoro (a te stesso e agli altri), considerando che ci sono casi più probabili che non gestisci, come una supernonva?
C'è anche una probabilità diversa da zero di eseguire il tunnel quantico attraverso la sedia e cadere sul pavimento, ma mettere un cuscino sotto è eccessivo. Dipende fortemente da ciò che stai facendo. Se stai sviluppando un microscopio a tunnel, l'inaspettato e improbabile è ciò che vuoi gestire (soprattutto perché a quella scala non diventa trascurabile). È tecnicamente più probabile affrontare i casi di memoria rispetto alle collisioni SHA, ma non ho mai visto seriamente la gestione del codice OOM. –
Qui, ad esempio, è un esempio in cui MSFT checking for collisions in the GUID space ha causato un errore in SQL Server che doveva essere sottoposto a hotfix in Windows 2000. – corprew
La recente vulnerabilità [OpenSSL] (http://www.ubuntu.com/usn/usn-612 -1) sarebbe probabilmente stato rilevato molto prima se gli sviluppatori avessero incluso qualche codice di test. Ovviamente non dovrebbe tentare di esaminare tutte le possibili fonti, ma si otterrebbe una buona idea delle probabilità se esegue un milione di iterazioni senza preavviso. La conoscenza è migliore della fede. – l0b0