PHP

Самый быстрый хеш

Самый быстрый хеш не криптографический!

Понадобилось мне как-то сохранять все запросы к БД и отмечать их каким-то уникальным ключом. Идея такая запросы подготавливаются через PDO prepare и сохраняются в виде готовых объектов. При повторном использовании проверяем если есть такой Sql (по ключу) используем готовый объект. Вот и стало интересно какой хеш самый быстрый. В php есть такая функция hash() создает хеш строки по указанному алгоритму а список поддерживаемых алгоритмов можно получить функцией hash_algos() нус делаем испытания :
algoritmtimehash
adler320.0412f9881ed0
fnv1320.04145d65a77e
fnv1a320.0461903182c8
fnv1640.04683573306254f02a9e
fnv1a640.0502f10ac4dea1b86dc8
joaat0.051380b948c4
md40.0589d4615fe1ffcc86dee0b43ecdbeb07317
md50.060212677062b5719e42f3d8b6b8943fc580
crc32b0.067262761bbd
crc320.0701ec007b9c
tiger128,30.0716cbc16eecf91b46d9159b09203cc24f05
tiger160,30.0723cbc16eecf91b46d9159b09203cc24f05242d27b8
tiger192,30.0754cbc16eecf91b46d9159b09203cc24f05242d27b8dd9b985b
sha10.08437d9f49fcc5eede01c82b1fef5e6057c0d372c01d
tiger128,40.08473d92e4df3275ccd3673355f9a8475fb5
tiger192,40.09083d92e4df3275ccd3673355f9a8475fb557ad0fa95ae1a195
sha3840.1150f492ea800a0f3a8247b6068302428785d3ee27d2d8c86ddc09eedc62380efbf9a51d480687eab2d589a89c574c6da41d
sha5120.1165cf35c00b173ba8146a58a2dc8c9120d52b0ada1551a572609a81250947207951f3134d47fee51ac9c28fe9f014eed6a026fda3b0a6ab2f312588783b765db416
sha3-2560.117689dd0c61e4ff1e4411cebea17813c6693c934b31b5e66df11226802bea99af49
sha3-2240.1177f2ee08a9416f98b9687c0a9a416da6d12ce29c958f06180ae9ffd944
ripemd1280.1199df100c460051431d3409718cfdb6c0f6
tiger160,40.12143d92e4df3275ccd3673355f9a8475fb557ad0fa9
sha3-3840.1229c5e4d6851f024ef3034f9ff0292213c148e92f39458afc8e6807dadaf88c000762be1a689f425314dec2c91eaec264c4
sha512/2560.1236804a0d845673a788a332c49e36c7db333e107c3c386f6601aa1a0d4ff0fc0507
haval192,30.1240e09371db5fc81c946bf4814e97942033d532aed5fd9e4aae
haval224,30.124869371bb26cf851f17e7cd0cc214c003326b5fa60a05e854aedd08b99
ripemd2560.1271fb7889b37d7baa360967643e6d9b9dc8a1509ee4a52905dd167ed917f3448789
haval256,30.127908ff42e2e71118c97b1beff2f1f1612e041a4047ac115a2a60a28393ee1fe6a1
sha2560.145813f863643ca3a39b4de894846b6a21e3fef6bf5e8a3a38fbbebdabc446179f7e
sha512/2240.14848c0f80f045a1bba1b8436016444e9dba69fc111c8f75311377e2d4c6
sha2240.1493644f2adb31487172f73fc732e9d044c112d0e9563526f61a0ce3a7e8
haval128,40.15070a8a5596439843224a6c610b8809cf55
haval128,30.15245f89103c090e75a64bf3d0bf61637de2
haval256,40.154566f52cd6f8bfd738b4ab9a980484e7102bda3b14048e72dcbed26e799f225a5f
haval192,40.15742cfb5796b8c492d20765b21e8113ca07f5f568e19c6abb5d
ripemd3200.1597aad51d20f2efa59998dc1d59e5dad19ac0007bf5a41a43b2ff31e5c43b206bfc7899ae75dc3dd80a
haval160,40.1603294958164b16974ac22cecdb80ec552d769b61ba
haval160,50.177434cfea7edaed10f776cf254caf4f3464516dc4b8
haval128,50.17835fce8070d97db9d0c638d1f4af52cae2
haval192,50.1805f2a03ddd5bfa18642563f6d011c7c76b91c798a947c8ef59
haval224,50.18223a8668932c23adc2550ac0a9d7716c176104965749ecd7cadf1e930c
ripemd1600.19267114cce04fbd8744987958366f4689760cda95bf
haval224,40.1940f106c9f29b34def1150142cb478b78ffe46e08bd204eaf1da80419a7
haval256,50.20936d8b354c6213e96508101cdbc4c86dd416cfca10059b387b39a83915c3fd0989
sha3-5120.21733955105edcb0e3dd6df9cba478700b824d2cafb03b163e29cea009776499f4ae26b4e091e39a6f51b83277dcf26a1e0e6603b413e76ccccc7dee61b564c24952
whirlpool0.3188f215b1934be66e54a6463a1fd7b7902af97aa992dd1cbbba121e0565cad686b8a63c56b688b5fe2eaab167026bb2f077907be97298bf6ba9ea0897a5164f399c
gost-crypto0.4863fce33b12b03177a80beb547f6d0dbe81cd750f77fee0ef1c1fd8b063228d9ae0
gost0.5908289ac585fb97dbf4cd08ba619d9adc0f82a22380fd28d22cd51f428c6def3375
snefru0.721609baf5867a7a4fbc5b971b7e6b66b761010c78192dbef1362a613736fb66eea0
snefru2560.775409baf5867a7a4fbc5b971b7e6b66b761010c78192dbef1362a613736fb66eea0
md22.61090328d6d2c7b3cd150206ac3f55701844

Первый три алгоритма идут adler32, fnv132, fnv1a32 - 8 разрядный хеш. Каждый раз при запуске кода они меняются местами разница по времени между ними незначительная. Далее идет fnv164 и fnv1a64 16-ти разрядный хеш, советуют брать 16-ти разрядный хеш, чтобы избежать коллизий (совпадений). Разница между 8-ми и 16-ти разрядным незначительная +13% так что берем fnv164 или fnv1a64. А вот в чем жду ними разница я не нашел объяснения. Вот php код для испытания: <?php
$algs 
=  hash_algos();
$loop 100000;
$pr 0;
foreach (
$algs as $alg) {
    
$start microtime(1);
    for (
$i $i <= $loop$i++) {
        
$hash hash ($alg$str);
    }
    if(
$time){
        
$pre_time $time;
    }

    
$time number_format(microtime(1) - $start4);



    
$res["$time"]  = [$alg,  $time$hash];
}
ksort($res);
echo 
"<div style=\"overflow:scroll; width:100%\">\r\n<table border=1>\r\n";
echo 
"<tr><th>algoritm</th><th>time</th><th>hash</th></tr>\r\n";
foreach (
$res as  $tr) {
    list(
$alg$time$hash) = $tr;
    echo 
"<tr><td><b>$alg</b></td><td>$time</td><td>$hash</td></tr>\r\n";
}
echo 
"</table>\r\n</div>";