Una función hash como MD5 procesa un mensaje de longitud arbitraria (hasta una longitud máxima ridículamente grande, algunos miles de millones de terabytes). El costo computacional sin procesar de MD5 se puede dividir aproximadamente en tres partes:
-
Inicialización : establece algunos valores de estado internos.
-
Procesamiento de datos : principalmente proporcional a la longitud de entrada.
-
Finalización : los "cálculos de cierre" de la función hash, que producen el resultado final (en ese paso ocurren cosas como el relleno).
OpenSSL, en sus puntos de referencia, mide la velocidad de realizar los tres pasos con mensajes de varias longitudes, de modo que usted podría inferir de alguna manera el costo del procesamiento de datos y el costo de los otros dos pasos .
Sin embargo, tales puntos de referencia no tienen sentido porque miden el rendimiento del código en condiciones poco realistas. Cuando se ejecuta OpenSSL, entra en un bucle estrecho, con un hash millones de mensajes en una fila: esto garantiza que el código de función de hash esté en el caché L1, que la predicción de rama en la CPU es completamente consciente dirección probable de cada salto condicional, y que los datos de entrada también se encuentran en la memoria caché L1 de la CPU. Nada de esto se aplica realmente a una situación práctica.
En la práctica, los costos de ancho de banda de E / S y RAM dominarán, especialmente con funciones hash "rápidas" como MD5; Además, la función hash no está sola en la ruta de datos, y otras tareas serán importantes. Por ejemplo, en su código, la llamada a strlen()
no tendrá un impacto insignificante en comparación con MD5 (será más rápida, pero no hasta el punto de no aparecer en las medidas).
Lo que debes hacer es medir el rendimiento de tu sistema completo , no solo la función hash; y haga eso con algunas funciones hash seleccionadas: esto usará el contexto de ejecución real. Además, es improbable que el costo del hash representa una proporción sustancial de su CPU.