Domanda

  

Possibile duplicato:
   Come posso generare un hashcode da un array di byte in c #

In C #, devo creare un hash di un'immagine per assicurarmi che sia univoco nello spazio di archiviazione.

Posso facilmente convertirlo in un array di byte, ma non sono sicuro di come procedere da lì.

Esistono classi nel framework .NET che possono aiutarmi o qualcuno è a conoscenza di alcuni algoritmi efficienti per creare un hash così unico?

È stato utile?

Soluzione

Esistono molti provider di hashsum in .NET che creano hash crittografici, il che soddisfa la tua condizione di essere unici (per la maggior parte a prova di collisione). Sono tutti estremamente veloci e sicuramente l'hash non sarà il collo di bottiglia nella tua app a meno che tu non lo stia facendo trilioni di volte.

Personalmente mi piace SHA1:

string hash;
using(SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider())
{
    hash = Convert.ToBase64String(sha1.ComputeHash(byteArray));
}

Anche quando le persone dicono che un metodo potrebbe essere più lento di un altro, è tutto in termini relativi. Un programma che si occupa di immagini sicuramente non noterà il processo di microsecondi di generazione di un hashsum.

E per quanto riguarda le collisioni, per molti scopi anche questo è irrilevante. Anche "obsoleto" metodi come MD5 sono ancora molto utili nella maggior parte delle situazioni. Si consiglia di non utilizzarlo solo quando la sicurezza del sistema si affida alla prevenzione delle collisioni.

Altri suggerimenti

La parte di La risposta di Rex M sull'uso di SHA1 per generare un hash è buona (MD5 è anche popolare opzione). Anche il suggerimento di zvolkov di non creare costantemente nuovi fornitori di criptovalute è buono (come lo è il suggerimento sull'uso di CRC se la velocità è più importante dell'unicità praticamente garantita.

Tuttavia, non utilizzare Encoding.UTF8 .GetString () per convertire un byte [] in una stringa (a meno che, naturalmente, non si sappia dal contesto che è UTF8 valido). Per uno, rifiuta surogates non validi . Un metodo garantito per fornire sempre una stringa valida da un byte [] è Convert. ToBase64String () .

La creazione di una nuova istanza di SHA1CryptoServiceProvider ogni volta che è necessario calcolare un hash NON è affatto veloce. Usare la stessa istanza è piuttosto veloce.

Comunque preferirei fare uno dei tanti algoritmi CRC invece di un hash crittografico poiché le funzioni hash progettate per la crittografia non funzionano troppo bene per dimensioni hash molto piccole (32 bit) che è quello che vuoi per il tuo GetHash ( ) sovrascrivi (supponendo che sia quello che vuoi).

Dai un'occhiata a questo link per un esempio di calcolo del CRC in C #: http: // sanity-free .org / 134 / standard_crc_16_in_csharp.html

P.S. il motivo per cui vuoi che il tuo hash sia piccolo (16 o 32 bit) è che puoi confrontarli VELOCEMENTE (questo era il punto di avere gli hash, ricordi?). Avere l'hash rappresentato da un valore lungo 256 bit codificato come stringa è piuttosto folle in termini di prestazioni.

È possibile utilizzare uno qualsiasi degli algoritmi di hash standard, ma l'hash non può tecnicamente garantire l'univocità. L'hashing è progettato per essere un token relativamente veloce e / o piccolo per essere in grado di vedere se un dato probabilmente è uguale all'altro. È possibile che set di dati completamente diversi producano lo stesso hash, sebbene essere in grado di produrre questi algoritmi sia molto difficile.

A parte questo, per verificare la probabile identità, MD5 è abbastanza veloce. SHA è più affidabile (MD5 è stato violato, quindi non dovrebbe essere usato per motivi di sicurezza), ma è anche più lento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top