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++
Respuesta
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.
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.
mesa disponible aquí:
http://www.golubev.com/gpuest.htm
parece probable que el cuello de botella será su disco duro IO
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.
- 1. C# Generación más rápida de hashes MD5
- 2. implementación rápida, limpia, C, timsort?
- 3. Implementación rápida de log2 (float x) C++
- 4. Implementación rápida/aproximación de la función pow() en C/C++
- 5. ¿Una alternativa más rápida a MD5?
- 6. ¿Implementación de cambio de matriz rápida en C#?
- 7. Implementación rápida de gradiente y descenso en una biblioteca C++?
- 8. ¿Implementación más rápida de Math.round?
- 9. ¿Implementación multiplataforma A * más rápida?
- 10. Rápida implementación de balanceo de hash
- 11. suma de prefijo paralelo - implementación más rápida
- 12. C# MD5 hasher ejemplo
- 13. Implementación SVM más rápida utilizable en Python
- 14. La implementación de escapada más rápida?
- 15. ¿Hay una implementación de TList más rápida?
- 16. Hash MD5 dado una clave en C#
- 17. Una implementación de la transformada rápida de Fourier (FFT) en C#
- 18. Ejemplo de adopción/implementación de enumeración rápida para mi clase?
- 19. ¿Cuál es la implementación más rápida de Dijkstra que conoces (en C++)?
- 20. Implementación simple de cifrado en C
- 21. implementación logsumexp en C?
- 22. implementación genérica en C
- 23. Implementación de ECC en C
- 24. Implementación de cola en C#
- 25. Implementación de RAII en C#
- 26. Implementación de MVar en C?
- 27. Implementación de memmove en C
- 28. Implementación de Grails: ¿la forma más rápida de implementarse?
- 29. Implementación de la derivada en C/C++
- 30. Biblioteca hash MD5 y SHA1 C++
Tiene estas unidades súper modernas, más rápidas que las SSD, ¿no es así? – avakar
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
@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