2011-07-10 9 views
9

usamos md5 como un algoritmo hash en muchas partes de nuestro código.¿cuál es el algoritmo de hash de mayor rendimiento disponible en php cuando la seguridad NO está en juego?

la seguridad en este contexto NO es un problema. simplemente usamos md5 como un método para generar un identificador único para almacenar varios elementos en la APC, etc.

colisiones son un problema. aunque improbable, causaría algunos problemas importantes.

alguien quiere sugerir algo más ligero en la CPU?

gracias.


acabamos de hacer algunas pruebas con md5 vs crc32.

usando el siguiente fragmento:

<? 
$start=microtime(true); 
for($i=1;$i<=1000000;$i++){ 
    md5(rand(10000000,99999999)); <--- crc32 tested here too. 
} 
$end=microtime(true); 
echo $end-$start."\n"; 
?> 

hay resultados son los siguientes:

md5:

1.4991459846497 
1.7893800735474 
1.4672470092773 

crc32:

0.97880411148071 
0.94331979751587 
0.93316197395325 

por lo que parece crc32 es aproximadamente 1/3 más rápido que usar md5.

Respuesta

8

Sería muy difícil (casi imposible, en realidad) para vencer a CRC32 o una variante, ya que es tan trivial (XOR rodando a través de una sola palabra de 32 bits). Además, dado que crc32 hace trampa y salta al código nativo, a menos que la otra solución también lo haga, es probable que la implementación nativa de CRC32 no sea superada.

Sin embargo, también tiene un mucho espacio más pequeño que MD5. ¿La compensación está bien? Los CRC32 generalmente son solo para detección/enmarcado de errores básicos ... (Realmente es una función de "suma de verificación" y no una función "hash" para fines prácticos de conversación).

Happy coding.


también sus números sólo muestran una reducción de 2/3 ;-) En cualquier caso, sospecho que esto no es el principal cuello de botella y se lo recomendaría el uso de un algoritmo que funciona - ya sea MD5 o SHA1 u otro. MD5 es solo ligeramente menos costoso desde el punto de vista informático que SHA1 (está dentro de un orden de magnitud), pero es posible que la implementación sea un factor. Ejecutar los puntos de referencia en este, así si lo desea ...

+0

hemos optado por ir con crc32. hacemos una tonelada de registro de errores para que cualquier colisión salga bastante rápido. Gracias por la respuesta detallada. –

0

Bueno, puedes usar el nombre de la variable como hash si quieres iluminar la CPU. SI desea convertir una cadena a una int, simplemente trátela como base 256 y conviértala en int.

Tal vez puedas probar sha, que produce una cuerda de 40 caracteres de largo para cualquier entrada.

+0

'nombre de la variable' no funcionará para nosotros, como gran parte de este md5'ing la que hablo es un controlador de memoria caché de consulta personalizada que tenemos. tal como está ahora almacenamos las consultas como 'consulta _'. md5 ($ consulta) ... en 20 segundos revise la pregunta original, ya que acabo de hacer algunas pruebas contra crc32. nos gustaría continuar utilizando algún tipo de sistema basado en hash, ya que gran parte del código se basa en eso. –

+0

@anonymous: ¿Cómo abuot sha? – Programmer

1

Uno de los comentarios en el userguide línea php muestra que md4 es el más rápido. Luego md5 seguido de crc32, seguido de sha1.

Mis propias pruebas verifican esto. Muy extraño que tu prueba muestre lo contrario. Probé tu fragmento también y obtuve los resultados opuestos. Tal vez depende de la máquina o de la versión de PHP.

http://php.net/manual/en/function.hash-algos.php

Cuestiones relacionadas