2011-11-18 20 views
5

Antes que nada, para ser claros, soy consciente de que existe una gran cantidad de implementaciones de MD5 en C++. El problema aquí es que me pregunto si existe una comparación de qué implementación es más rápida que las demás. Como estoy usando esta función hash MD5 en archivos con un tamaño superior a 10GB, la velocidad es una gran preocupación aquí.Implementación rápida de MD5 en C++

+11

Tiene estas unidades súper modernas, más rápidas que las SSD, ¿no es así? – avakar

+0

Esta [pregunta] (http://stackoverflow.com/questions/2717216/what-hash-algorithms-are-parallelizable-optimizing-the-hashing-of-large-files-u) podría ayudar. Iba a sugerir algo que puede paralelizar, pero supongo que depende de cómo se almacenan sus datos. – Vlad

+0

@avakar: Si los datos se replican, debería ser al menos plausible acelerar el cálculo ejecutándolo en paralelo fuera de las diferentes réplicas, si el sistema lo permite. – Vlad

Respuesta

9

creo que el avakar punto está tratando de hacer es: la moderna capacidad de procesamiento de la velocidad IO de su disco duro es el cuello de botella, no el cálculo del hash. Obtener un algoritmo más eficiente no lo ayudará, ya que no es (probablemente) el punto más lento.

Si está haciendo algo especial (miles de rondas, por ejemplo), entonces puede ser diferente, pero si solo está calculando un hash de un archivo. Necesita acelerar su IO, no su matemática.

2

Estoy seguro de que hay muchas adaptaciones CUDA/OpenCL del algoritmo que deberían darle una velocidad definida. También podría tomar el algoritmo básico y pensar un poco -> obtener una implementación CUDA/OpenCL en marcha.

Las cifras de bloques son candidatos perfectos para este tipo de implementación.

También podría obtener una implementación C y obtener una copia del compilador Intel C y ver qué tan bueno es eso. Las extensiones de vectorización en las CPU de Intel son increíbles para aumentar la velocidad.

3

No creo que importe mucho (en el mismo hardware, pero de hecho las GPGPU-s son hardware diferente, y quizás más rápido, para ese tipo de problema). La parte principal de md5 es un ciclo bastante complejo de operaciones aritméticas complejas. Lo que sí importa es la calidad de las optimizaciones del compilador.

Y lo que también importa es cómo leer el archivo. En Linux, mmap y madvise y readahead podrían ser relevantes. La velocidad del disco es probablemente el cuello de botella (use una SSD si puede).

¿Y seguro que quiere md5 específicamente? Hay algoritmos de codificación hash más simples y rápidos (md4, etc.). Todavía su problema es más E/S obligado que CPU enlazado.

Cuestiones relacionadas