Estoy interesado en optimizar el hash de algunos archivos grandes (optimizar el tiempo del reloj de pared). La E/S ya se ha optimizado lo suficiente y el dispositivo de E/S (SSD local) solo recibe un 25% de la capacidad, mientras que uno de los núcleos de la CPU está completamente agotado.¿Qué algoritmos hash son paralelizables? Optimización del hashing de archivos de gran tamaño que se utilizan en CPU multinúcleo
Tengo más núcleos disponibles, y en el futuro es probable que tenga aún más núcleos. Hasta ahora solo he podido acceder a más núcleos si necesito varios hashes del mismo archivo, digamos un MD5 Y un SHA256 al mismo tiempo. Puedo usar el mismo flujo de E/S para alimentar dos o más algoritmos de hash, y obtengo los algoritmos más rápidos de forma gratuita (en cuanto al tiempo del reloj de pared). Según entiendo la mayoría de los algoritmos hash, cada bit nuevo cambia el resultado completo, y es inherentemente difícil/imposible de hacer en paralelo.
¿Algún algoritmo hash convencional es paralelizable?
¿Hay hash no convencionales que sean paralelizables (y que tengan al menos una implementación de muestra disponible)?
Como las futuras CPU tenderán hacia más núcleos y una nivelación en la velocidad del reloj, ¿hay alguna manera de mejorar el rendimiento del hash de archivos? (además del overclocking refrigerado por nitrógeno líquido?) o es intrínsecamente no paralelizable?
Además, oigo que la mayoría de los algoritmos hash actuales _es ser paralelizados, pero no estoy seguro de lo que tiene. Obviamente, una forma de hacerlo sería decidir por ti mismo hash cada, por ejemplo, 4k fragmento de archivo, y luego combinar los hash de alguna manera. XOR, tal vez? Siempre es peligroso criptográficamente inventar tu propio algoritmo, por lo que no confiaría en esto si defiendes la manipulación de datos maliciosos en lugar de la corrupción accidental de datos. – sblom
Leí la especificación Skein que ha vinculado. Lo que sugieres aquí es exactamente cómo se logra la paralelización (aparentemente se llama "hashing de árbol"). Skein tiene una forma estándar de especificar el tamaño de hoja, despliegue y altura máxima del árbol para que cualquiera que use los mismos parámetros obtenga el mismo hash resultado. (eso es importante) Me gustaría defenderme contra la manipulación maliciosa y la corrupción accidental. Ojalá los estándares estuvieran listos. – DanO
http://tools.ietf.org/html/rfc1321 Parece MD5 no es fácilmente paralelizable, los cálculos para cada bloque dependen del estado calculada con todos los bloques anteriores. Si esta propiedad no fuera válida, entonces MD5 no sería segura (el cambio de la posición de los bloques no afectaría al hash, no es bueno). De todos modos, no digo que la paralelización de MD5 no sea posible, simplemente imposible a primera vista. – kgadek