Benchmark des fonctions de hash - PHP

Publié le 23 mars 2010 par Petitchevalroux

En plus des fonctions les plus connues comme md5 ou crc32 php propose un tas d'autres algorithmes de hash. Pour faciliter le choix de la bonne fonction de hash, voici un petit benchmark qui teste la rapidité et les performances des fonctions de hash. Ce benchmark est réalisé avec la version 5.2.6 de php sur une debian lenny.

La première partie du benchmark propose le test des différents algos de hash en utilisant la fonction hash de php.

La seconde partie compare les fonctions core de php (md5, crc32 et sha1) avec l'appel de ces algorithmes via la fonction hash.

Résultats

Je préfère vous donner les résultats en début d'article pour vous éviter une luxation de l'index. Pour résumer les fonctions crc32 et md5 s'en sortent mieux que leurs homologues qui utilisent la fonction hash. La plus rapide des deux est la fonction crc32.

Note sur la fonction crc32

La fonction crc32 de php est buggée sur les systèmes 64 bits (cf : crc32() returns 64-bit number on 64-bit achitectures). Elle retourne des entiers 64 bits : un comble pour une fonction estampillée 32. Ce bug peut poser problème pour stocker des crc en base de données ou encore si vous avez un parc de machines hétérogènes (32 et 64).

Code du benchmark avec la fonction hash

<?php
set_time_limit(0);
/*On récupère la liste des algos de hash*/
$algos = hash_algos();
$results = array();
/*Pour tous les algos de hash*/
foreach ($algos as $a)
{
/*Départ du timer*/
$t = microtime(true);
for ($i = 0;$i<1000000;$i++)
{
hash($a,'amzlekamzekamdskqmlsdkmqldk');
}
/*Fin du timer on stocke le résultat*/
$results[$a] = microtime(true) - $t;
}
/*On trie le tableau de résultat*/
asort($results,SORT_NUMERIC);
var_dump($results);
?>

Résultats du benchmark avec la fonction hash

array
'crc32b' => float 1.120276927948
'crc32' => float 1.1310670375824
'adler32' => float 1.2000839710236
'md4' => float 1.2551829814911
'md5' => float 1.3403470516205
'tiger128,3' => float 1.3744769096375
'tiger160,3' => float 1.3787548542023
'tiger192,3' => float 1.3895869255066
'tiger128,4' => float 1.4659309387207
'tiger192,4' => float 1.4789469242096
'tiger160,4' => float 1.4815518856049
'sha1' => float 1.4925508499146
'ripemd128' => float 1.519170999527
'ripemd256' => float 1.530699968338
'ripemd160' => float 1.724916934967
'sha256' => float 1.8227860927582
'haval160,3' => float 2.0593440532684
'sha384' => float 2.060436964035
'haval224,3' => float 2.0820391178131
'sha512' => float 2.0842130184174
'haval128,3' => float 2.0860729217529
'haval256,3' => float 2.0956799983978
'haval128,4' => float 2.4296901226044
'ripemd320' => float 2.4344120025635
'haval160,4' => float 2.4387040138245
'haval224,4' => float 2.4431009292603
'haval256,4' => float 2.4435861110687
'whirlpool' => float 2.4480822086334
'haval192,4' => float 2.4514420032501
'haval128,5' => float 2.6351850032806
'haval192,5' => float 2.6580541133881
'haval160,5' => float 2.6623408794403
'haval224,5' => float 2.664046049118
'haval192,3' => float 2.6963078975677
'haval256,5' => float 3.2646629810333
'gost' => float 3.4551179409027
'snefru' => float 4.4325668811798
'md2' => float 6.2273321151733

Code du benchmark hash vs fonction php

<?php
set_time_limit(0);
$string = 'amzlekamzekamdskqmlsdkmqldk';
$t = microtime(true);
for ($i = 0;$i<1000000;$i++)
{
hash('md5',$string);
}
$results['hash md5'] = microtime(true) - $t;
$t = microtime(true);
for ($i = 0;$i<1000000;$i++)
{
md5($string);
}
$results['md5'] = microtime(true) - $t;
$t = microtime(true);
for ($i = 0;$i<1000000;$i++)
{
hash('crc32',$string);
}
$results['hash crc32'] = microtime(true) - $t;
$t = microtime(true);
for ($i = 0;$i<1000000;$i++)
{
hash('crc32b',$string);
}
$results['hash crc32b'] = microtime(true) - $t;
$t = microtime(true);
for ($i = 0;$i<1000000;$i++)
{
crc32($string);
}
$results['crc32'] = microtime(true) - $t;
$t = microtime(true);
for ($i = 0;$i<1000000;$i++)
{
hash('sha1',$string);
}
$results['hash sha1'] = microtime(true) - $t;
$t = microtime(true);
for ($i = 0;$i<1000000;$i++)
{
sha1($string);
}
$results['sha1'] = microtime(true) - $t;
asort($results,SORT_NUMERIC);
var_dump($results);
?>

Résultats du benchmark hash vs fonction php

array
'crc32' => float 0.85288596153259
'md5' => float 1.1399281024933
'hash crc32b' => float 1.1789608001709
'hash crc32' => float 1.2055170536041
'hash md5' => float 1.3627300262451
'hash sha1' => float 1.5138599872589
'sha1' => float 1.9070608615875

Image : arrtx1