Prima di tutto, per essere chiari, sono a conoscenza del fatto che in C++ esiste un numero enorme di implementazioni MD5. Il problema qui è che mi sto chiedendo se esiste un confronto tra l'implementazione più veloce delle altre. Dal momento che sto usando questa funzione di hash MD5 su file con dimensioni superiori a 10 GB, la velocità è davvero una grande preoccupazione qui.Implementazione veloce di MD5 in C++
risposta
penso che l'avakar punto sta cercando di fare è: con la moderna potenza di elaborazione della velocità IO il tuo disco fisso è il collo di bottiglia, non il calcolo dell'hash. Ottenere un algoritmo più efficiente non ti aiuterà in quanto non è (probabilmente) il punto più lento.
Se si sta facendo qualcosa di speciale (migliaia di giri ad esempio), allora potrebbe essere diverso, ma se si sta solo calcolando un hash di un file. Devi accelerare il tuo IO, non i tuoi calcoli.
Sono sicuro che ci sono un sacco di adattamenti CUDA/OpenCL dell'algoritmo là fuori che dovrebbero darti una certa velocità. Potresti anche prendere l'algoritmo di base e pensare un po '-> ottenere l'implementazione di CUDA/OpenCL.
I codici a blocchi sono candidati perfetti per questo tipo di implementazione.
Si potrebbe anche ottenere un'implementazione C di esso e prendere una copia del compilatore Intel C e vedere quanto è buono. Le estensioni di vettorizzazione nelle CPU Intel sono sorprendenti per gli aumenti di velocità.
tavolo disponibile qui:
http://www.golubev.com/gpuest.htm
sembra probabilmente il vostro collo di bottiglia sarà il vostro hard disk IO
Non penso che importi molto (sullo stesso hardware, ma in effetti i GPGPU sono diversi, e forse più veloci, l'hardware per quel tipo di problema). La parte principale di md5 è un ciclo piuttosto complesso di complesse operazioni aritmetiche. Ciò che importa è la qualità delle ottimizzazioni del compilatore.
E ciò che importa è anche come si legge il file. Su Linux, mmap e madvise e readahead potrebbero essere rilevanti. La velocità del disco è probabilmente il collo di bottiglia (usa un SSD se puoi).
E sei sicuro di volere md5 in particolare? Esistono algoritmi di codifica hash più semplici e veloci (md4, ecc.). Ancora il tuo problema è più legato all'I/O rispetto alla CPU.
Avete questi drive super-moderni, più veloci di SSD, vero? – avakar
Questa [domanda] (http://stackoverflow.com/questions/2717216/what-hash-algorithms-are-parallelizable-optimizing-the-hashing-of-large-files-u) potrebbe aiutare. Stavo per suggerire qualcosa che puoi parallelizzare, ma suppongo che dipenda da come vengono archiviati i tuoi dati. – Vlad
@avakar: se i dati vengono replicati, dovrebbe essere almeno plausibile accelerare il calcolo eseguendolo in parallelo al di fuori delle diverse repliche, se il sistema lo consentiva. – Vlad