La prima domanda è ciò per cui è necessario questo checksum. Se non hai bisogno delle proprietà crittografiche, allora un hash non crittografico, o un hash che è meno crittograficamente sicuro (MD5 "rotto" non impedisce che sia un buon hash, né ancora abbastanza forte per alcuni usi) è probabilmente più performante. Potresti creare il tuo hash leggendo un sottoinsieme di dati (ti consiglio di fare in modo che questo sottoinsieme funzioni in 4096 byte di file sottostante, poiché questo corrisponderebbe alla dimensione del buffer usata da SHA1Managed oltre a consentire una lettura più veloce di lo faresti se dicessi ogni X byte per qualche valore di X).
Edit: un upvote ricordandomi di questa risposta, ha anche mi ha ricordato che ho da quando scrissi SpookilySharp che fornisce alte prestazioni a 32, a 64 ea 128 bit hash crittografico che non sono, ma buona per la fornitura di checksum contro gli errori , archiviazione, ecc. (Questo a sua volta mi ha ricordato che dovrei aggiornarlo per supportare .NET Core).
Ovviamente, se si desidera che l'SHA-1 del file interagisca con qualcos'altro, si è bloccati.
Vorrei sperimentare diverse dimensioni del buffer, poiché l'aumento delle dimensioni del buffer del filestream può aumentare la velocità a scapito della memoria aggiuntiva. Consiglierei un intero multiplo di 4096 (4096 è l'impostazione predefinita, incidentalmente) poiché SHA1Managed chiederà 4096 blocchi alla volta, e in questo modo non ci saranno casi in cui FileStream restituisce meno del più richiesto (consentito ma a volte non ottimale) o fa più di una copia alla volta.
fonte
2010-10-01 09:21:56
+1 solo per cercare di migliorare le prestazioni del bit più pesante, e non preoccuparsi che il formato sia costruito in un modo relativamente inefficiente :) –
:) dovrebbe probabilmente cambiarlo in un costruttore di stringhe? –
Ah, ora ti stai parlando di quel +1! Ciò che può essere utile se si producono tali stringhe esadecimali spesso è avere un metodo che faccia questo (buon caso per un metodo di estensione). Essendo quindi potenzialmente utilizzato da qualche parte dove le prestazioni faranno la differenza più reale, sarebbe più utile spostare il StringBuilder (creato alla capacità appropriata) o gli approcci di array di char a dimensione fissa. –