Friday, January 25, 2008

Производительность хэш-функций в PHP 5.2

Неожиданно для себя обнаружил что в PHP (от v5.1.2) оказывается есть функция hash(), котороя поддерживает различные алгоритмы хэширования, в том числе md5 и sha1. Но, функция md5() работает медленнее чем эквивалентная hash('md5'). Решил проверить и заодно узнать какие алгоритмы поддерживаются (на примере v5.2.5 под vista).

Проверял примерно вот так:
$a =  hash_algos();
$exclude = array('');

test_md5();
print "\n";

foreach($a as $v)
{
if(!in_array($v, $exclude))
test_algo($v);
}

#=== procs ==
function test_algo($algo)
{
$time = microtime(1);
$s = '';
for($i=0; $i<150000; $i++)
$s = hash($algo, 'is this string too long? maybe not! strlen=45');

$time = microtime(1)-$time;
print "$algo (" . strlen($s) . " bytes) - " . (number_format($time, 4)) ." s\n";
}

function test_md5()
{
$time = microtime(1);
$s = '';
for($i=0; $i<150000; $i++)
$s = md5('is this string too long? maybe not! strlen=45');
$time = microtime(1)-$time;
print "function md5() - " . (number_format($time, 4)) ." s\n";
}


Результаты:
function md5() - 0.2412 s

md2 (32 bytes) - 7.2568 s
md4 (32 bytes) - 0.2991 s
md5 (32 bytes) - 0.3149 s
sha1 (40 bytes) - 0.3436 s
sha256 (64 bytes) - 0.4768 s
sha384 (96 bytes) - 1.2349 s
sha512 (128 bytes) - 1.2481 s
ripemd128 (32 bytes) - 0.5023 s
ripemd160 (40 bytes) - 0.5224 s
ripemd256 (64 bytes) - 0.4766 s
ripemd320 (80 bytes) - 0.5418 s
whirlpool (128 bytes) - 1.5320 s
tiger128,3 (32 bytes) - 0.4329 s
tiger160,3 (40 bytes) - 0.4403 s
tiger192,3 (48 bytes) - 0.4572 s
tiger128,4 (32 bytes) - 0.4657 s
tiger160,4 (40 bytes) - 0.4757 s
tiger192,4 (48 bytes) - 0.4854 s
snefru (64 bytes) - 1.4405 s
gost (64 bytes) - 1.3708 s
adler32 (8 bytes) - 0.3449 s
crc32 (8 bytes) - 0.2813 s
crc32b (8 bytes) - 0.2896 s
haval128,3 (32 bytes) - 0.5591 s
haval160,3 (40 bytes) - 0.5566 s
haval192,3 (48 bytes) - 0.5714 s
haval224,3 (56 bytes) - 0.5747 s
haval256,3 (64 bytes) - 0.5768 s
haval128,4 (32 bytes) - 0.6543 s
haval160,4 (40 bytes) - 0.6726 s
haval192,4 (48 bytes) - 0.6576 s
haval224,4 (56 bytes) - 0.6546 s
haval256,4 (64 bytes) - 0.6607 s
haval128,5 (32 bytes) - 0.7046 s
haval160,5 (40 bytes) - 0.7097 s
haval192,5 (48 bytes) - 0.7188 s
haval224,5 (56 bytes) - 0.7197 s
haval256,5 (64 bytes) - 0.7221 s


Действительно, так и есть (разница на 30%). Также проверил Fedora 8 с предустановленным PHP v5.2.4 - cоотношение примерно такое же (20%). Причем в PHP v5.2.0 под виндой производительноcnь md5() оказывается ниже в 3 (!) раза.