Visualiser une révision
voxdemonix : révision n°1 (09 février 2020 16:52:38)
[PHP] Tester la vitesse de hashage des différents algorithmes
===========
Afin d'optimiser le code, il est toujours primordiale de trouver quelles sont les fonctions les plus rapide correspondant à un problème donné.
Les codes présentés ici vont permettre de tester facilement sur son propre serveur la vitesse de hashage des différents algorithmes et ce en monothread (un seul processus qui exécute tout) ou en multithread (un processus par fonction de hashage).
Monothread
-----------
Ce code fonctionne sur tout les systèmes d'exploitation.
```php
<?php
$maxLoop=1000000;
$total=time();
$list=array();
foreach (hash_algos() as $algo) {
echo '<br /> =============> Algorithme : '.$algo.'<br />';
$t=millitime();
$i=0;
while ( $i <= $maxLoop) {
hash($algo, 'data');
$i++;
}
$t=(millitime()-$t);
echo ' - Loop : '.$maxLoop.' ;<br /> - Execution time : '.$t.'ms ('.($t/$maxLoop).'ms/hash) ;<br /> - Lenght : '.strlen(hash($algo, 'hello_world')).' ;<br /> - Example : "hello_world" => '.hash($algo, 'hello_world');
$list[$algo]=$t/$maxLoop;
}
echo '<br /><br /> <strong>Total execution time : '.(time()-$total).'s</strong>';
asort($list);
echo '<br /> - - - ms/hash => algo';
foreach ($list as $algo => $ms) {
echo '<br /> - - - '.$ms.' => '.$algo;
}
// initialize array (IMPORTANT)
function millitime() {
$microtime = microtime();
$comps = explode(' ', $microtime);
// Note: Using a string here to prevent loss of precision
// in case of "overflow" (PHP converts it to a double)
return sprintf('%d%03d', $comps[1], $comps[0] * 1000);
}
?>
```
MultiThread sur GNU/Linux
-----------
Attention : ce code ne fonctionne que sur les système type Ubuntu, Debian.
```php
<?php
$maxLoop=1000000;
$file='/tmp/test'; // path and file prefix
function millitime() {
$microtime = microtime();
$comps = explode(' ', $microtime);
// Note: Using a string here to prevent loss of precision
// in case of "overflow" (PHP converts it to a double)
return sprintf('%d%03d', $comps[1], $comps[0] * 1000);
}
function hashthis($algo, $maxLoop){
$t=millitime();
$i=0;
while ( $i <= $maxLoop) {
hash($algo, 'data');
$i++;
}
$t=(millitime()-$t);
return '<br /> =============> Algorithme : '.$algo.'<br /> - Loop : '.$maxLoop.' ;<br /> - Execution time : '.$t.'ms ('.($t/$maxLoop).'ms/hash) ;<br /> - Lenght : '.strlen(hash($algo, 'hello_world')).' ;<br /> - Example : "hello_world" => '.hash($algo, 'hello_world');
}
if ($argv) { // if their is command parameter
// sub process script actions :
foreach ($argv as $value) {
if(preg_match('/algo:(.*)/', $value, $match)){
$algo=$match[1];
}
if(preg_match('/maxLoop:(.*)/', $value, $match)){
$maxLoop=$match[1];
}
}
$stream = fopen($file.'_'.$algo.'.txt', 'w+');
fwrite($stream, hashthis($algo, $maxLoop));
fwrite($stream, "\r\nstop"); // if your command already send a line break, remove \r\n
fclose($stream);
exit;
}else{
// main script action
$timer=time(); // used for displaying duration time
// we creat our command list (important, the scrript need know how much command and return their is)
$fileList=array();
foreach(hash_algos() as $algo){
// lunch sub process
$fileList[$algo]=array('file'=>urlencode($algo));
$algo=urlencode($algo);
system("php -f ".$_SERVER["SCRIPT_FILENAME"]." algo:".$algo." maxLoop:".$maxLoop." < /dev/null > /dev/null 2> /dev/null &");
usleep(250000);
}
// we w8t each sub process write 'stop' in it memory file
$stop=true;
$raw=array();
$startTime=time();
$maxActions=count(hash_algos());
$timeout=250; // in sec
while ($stop) {
sleep(1);
$numberActions=intval(shell_exec('tail -n 1 '.$file.'*.txt | grep "stop" | wc -l'));
if ( $maxActions==$numberActions || (time()-$startTime) >= $timeout ) {
$stop=false;
if ($maxActions==$numberActions) {
shell_exec("sed -i '$ d' ".$file."*.txt"); // remove the "stop" in the last line in each file
# all actions good, load
// recover informations
foreach ($fileList as $value) {
$raw[]=file_get_contents($file.'_'.$value['file'].'.txt');
usleep(200000); // w8t filesystem unlock files
unlink($file.'_'.$value['file'].'.txt');
}
}
}
}
// finish, display infos
echo 'Duration : '.(time()-$timer).' s<br />';
//print_r($raw);
foreach ($raw as $infos) {
echo $infos;
}
}
?>
```
Résultat MonoThread sur ARM
```
=============> Algorithme : md2
- Loop : 1000000 ;
- Execution time : 6157ms (0.006157ms/hash) ;
- Lenght : 32 ;
- Example : "hello_world" => 219f1e1a03f35203d9b5d1edaa2bbff9
=============> Algorithme : md4
- Loop : 1000000 ;
- Execution time : 917ms (0.000917ms/hash) ;
- Lenght : 32 ;
- Example : "hello_world" => b1540c4595efb6cd0055c2cc5f6d788d
=============> Algorithme : md5
- Loop : 1000000 ;
- Execution time : 884ms (0.000884ms/hash) ;
- Lenght : 32 ;
- Example : "hello_world" => 99b1ff8f11781541f7f89f9bd41c4a17
=============> Algorithme : sha1
- Loop : 1000000 ;
- Execution time : 1180ms (0.00118ms/hash) ;
- Lenght : 40 ;
- Example : "hello_world" => e4ecd6fc11898565af24977e992cea0c9c7b7025
=============> Algorithme : sha224
- Loop : 1000000 ;
- Execution time : 1723ms (0.001723ms/hash) ;
- Lenght : 56 ;
- Example : "hello_world" => 69c9392f54e5a0e0fff8945e9ed6475ef89236092a52b2005776912c
=============> Algorithme : sha256
- Loop : 1000000 ;
- Execution time : 1736ms (0.001736ms/hash) ;
- Lenght : 64 ;
- Example : "hello_world" => 35072c1ae546350e0bfa7ab11d49dc6f129e72ccd57ec7eb671225bbd197c8f1
=============> Algorithme : sha384
- Loop : 1000000 ;
- Execution time : 3979ms (0.003979ms/hash) ;
- Lenght : 96 ;
- Example : "hello_world" => 7f251a65acbe92af4c6a6d624c0860d9be77329e10e5beb3b9594f7916128cd95610a4d84e3a83a24a72362f6c8f9c46
=============> Algorithme : sha512/224
- Loop : 1000000 ;
- Execution time : 3976ms (0.003976ms/hash) ;
- Lenght : 56 ;
- Example : "hello_world" => cd546e1ab3b0a2efa3a1488a4f9ec71368bfd95c918059171411827a
=============> Algorithme : sha512/256
- Loop : 1000000 ;
- Execution time : 3974ms (0.003974ms/hash) ;
- Lenght : 64 ;
- Example : "hello_world" => 3994440152c5d49d10d530e91a33e158b6971dce086f474c51feeea5fac5550f
=============> Algorithme : sha512
- Loop : 1000000 ;
- Execution time : 4022ms (0.004022ms/hash) ;
- Lenght : 128 ;
- Example : "hello_world" => 94f427efefa74c1230c3e93c35104dcbaa8ff71ba4537583ed83c0449d607c4e61b39c4c5eea5543e01d76a68e223da02b500530a82156625cb96ee8c8c80a85
=============> Algorithme : sha3-224
- Loop : 1000000 ;
- Execution time : 5317ms (0.005317ms/hash) ;
- Lenght : 56 ;
- Example : "hello_world" => e24c066a49e260ba46a7b73d5d2374bfe86670be8ebbdf547bfce343
=============> Algorithme : sha3-256
- Loop : 1000000 ;
- Execution time : 5394ms (0.005394ms/hash) ;
- Lenght : 64 ;
- Example : "hello_world" => fed30406b832b6c457e1e3605016eadfe7b57074c050e16ce2321de734ab29f4
=============> Algorithme : sha3-384
- Loop : 1000000 ;
- Execution time : 5500ms (0.0055ms/hash) ;
- Lenght : 96 ;
- Example : "hello_world" => d407e9fb45a350dce0d557f4d3d514f0a7db816163d3666b9e3ae61339a8b0a500129ef456fb9af7105c606599bc3ca1
=============> Algorithme : sha3-512
- Loop : 1000000 ;
- Execution time : 5587ms (0.005587ms/hash) ;
- Lenght : 128 ;
- Example : "hello_world" => 3d96f9b16a74980badc6aa05f8f102d781212744aee86e4c20f75c427f79ccea709487b2562c6e633607b53d0b247c389b88a9c3a9e032fadbdfe6ab9e00c528
=============> Algorithme : ripemd128
- Loop : 1000000 ;
- Execution time : 1448ms (0.001448ms/hash) ;
- Lenght : 32 ;
- Example : "hello_world" => 7ca29bdacaf287c93f96e0ecd36c9012
=============> Algorithme : ripemd160
- Loop : 1000000 ;
- Execution time : 1721ms (0.001721ms/hash) ;
- Lenght : 40 ;
- Example : "hello_world" => c6b22ca8b206534aed9b5942b59d5159cc16e561
=============> Algorithme : ripemd256
- Loop : 1000000 ;
- Execution time : 1487ms (0.001487ms/hash) ;
- Lenght : 64 ;
- Example : "hello_world" => f482a15c39b21ab09c9955fbd248f179704beca8672b95b59487f1474e4368c0
=============> Algorithme : ripemd320
- Loop : 1000000 ;
- Execution time : 1856ms (0.001856ms/hash) ;
- Lenght : 80 ;
- Example : "hello_world" => 473bf2ed405aa5b43beaad7ce28caad104913c347ff074addd0074088dd8766526d6d4603d5b2205
=============> Algorithme : whirlpool
- Loop : 1000000 ;
- Execution time : 4273ms (0.004273ms/hash) ;
- Lenght : 128 ;
- Example : "hello_world" => dc9812f562c463e1a56e8859ef4e0767757b2b5d41e3fc62fbcdebdf6a71fee19dd21e2308657e20e643dd8179c71b7d309b5b2af4c455a279609eb1d4ceaca7
=============> Algorithme : tiger128,3
- Loop : 1000000 ;
- Execution time : 1309ms (0.001309ms/hash) ;
- Lenght : 32 ;
- Example : "hello_world" => 3412a35e2b715dcf05274b83e3a8d461
=============> Algorithme : tiger160,3
- Loop : 1000000 ;
- Execution time : 1323ms (0.001323ms/hash) ;
- Lenght : 40 ;
- Example : "hello_world" => 3412a35e2b715dcf05274b83e3a8d461518eb3aa
=============> Algorithme : tiger192,3
- Loop : 1000000 ;
- Execution time : 1483ms (0.001483ms/hash) ;
- Lenght : 48 ;
- Example : "hello_world" => 3412a35e2b715dcf05274b83e3a8d461518eb3aa69fdd874
=============> Algorithme : tiger128,4
- Loop : 1000000 ;
- Execution time : 1507ms (0.001507ms/hash) ;
- Lenght : 32 ;
- Example : "hello_world" => a684e143ea477b6e044f86ee8c5cdf82
=============> Algorithme : tiger160,4
- Loop : 1000000 ;
- Execution time : 1524ms (0.001524ms/hash) ;
- Lenght : 40 ;
- Example : "hello_world" => a684e143ea477b6e044f86ee8c5cdf824b2de298
=============> Algorithme : tiger192,4
- Loop : 1000000 ;
- Execution time : 1740ms (0.00174ms/hash) ;
- Lenght : 48 ;
- Example : "hello_world" => a684e143ea477b6e044f86ee8c5cdf824b2de298650bdf4c
=============> Algorithme : snefru
- Loop : 1000000 ;
- Execution time : 4801ms (0.004801ms/hash) ;
- Lenght : 64 ;
- Example : "hello_world" => 3e359d3d0416bebc586a4d149782943df2f18d3335f10151befbf0f1e50ce93c
=============> Algorithme : snefru256
- Loop : 1000000 ;
- Execution time : 4853ms (0.004853ms/hash) ;
- Lenght : 64 ;
- Example : "hello_world" => 3e359d3d0416bebc586a4d149782943df2f18d3335f10151befbf0f1e50ce93c
=============> Algorithme : gost
- Loop : 1000000 ;
- Execution time : 4251ms (0.004251ms/hash) ;
- Lenght : 64 ;
- Example : "hello_world" => 83e75079a85f89b4828a9b863f5f95e364498ad8adde42fe566a73d64cc81282
=============> Algorithme : gost-crypto
- Loop : 1000000 ;
- Execution time : 4365ms (0.004365ms/hash) ;
- Lenght : 64 ;
- Example : "hello_world" => 12663d5e3909912c9c53add5a8d95cfd90574ba86303de300f8bb7cbf8898860
=============> Algorithme : adler32
- Loop : 1000000 ;
- Execution time : 574ms (0.000574ms/hash) ;
- Lenght : 8 ;
- Example : "hello_world" => 1b85049c
=============> Algorithme : crc32
- Loop : 1000000 ;
- Execution time : 539ms (0.000539ms/hash) ;
- Lenght : 8 ;
- Example : "hello_world" => 8c0ae9d2
=============> Algorithme : crc32b
- Loop : 1000000 ;
- Execution time : 551ms (0.000551ms/hash) ;
- Lenght : 8 ;
- Example : "hello_world" => f73eae91
=============> Algorithme : fnv132
- Loop : 1000000 ;
- Execution time : 560ms (0.00056ms/hash) ;
- Lenght : 8 ;
- Example : "hello_world" => 585cb2f6
=============> Algorithme : fnv1a32
- Loop : 1000000 ;
- Execution time : 507ms (0.000507ms/hash) ;
- Lenght : 8 ;
- Example : "hello_world" => e6c136a8
=============> Algorithme : fnv164
- Loop : 1000000 ;
- Execution time : 571ms (0.000571ms/hash) ;
- Lenght : 16 ;
- Example : "hello_world" => fe2326676546b716
=============> Algorithme : fnv1a64
- Loop : 1000000 ;
- Execution time : 593ms (0.000593ms/hash) ;
- Lenght : 16 ;
- Example : "hello_world" => 2de37268ea7d0f68
=============> Algorithme : joaat
- Loop : 1000000 ;
- Execution time : 538ms (0.000538ms/hash) ;
- Lenght : 8 ;
- Example : "hello_world" => 169d5817
=============> Algorithme : haval128,3
- Loop : 1000000 ;
- Execution time : 2615ms (0.002615ms/hash) ;
- Lenght : 32 ;
- Example : "hello_world" => 149b46dacad5d89e280551577b7fb516
=============> Algorithme : haval160,3
- Loop : 1000000 ;
- Execution time : 2579ms (0.002579ms/hash) ;
- Lenght : 40 ;
- Example : "hello_world" => 14a0fa3ffcb40422681acf0a544006dc5c182ca0
=============> Algorithme : haval192,3
- Loop : 1000000 ;
- Execution time : 2645ms (0.002645ms/hash) ;
- Lenght : 48 ;
- Example : "hello_world" => 9b828664dc67fe06fb77412aed41af43ce434e11fe460763
=============> Algorithme : haval224,3
- Loop : 1000000 ;
- Execution time : 2634ms (0.002634ms/hash) ;
- Lenght : 56 ;
- Example : "hello_world" => d27776ca2b634f1087d9ff609115a0c549f6380748332f644856aa31
=============> Algorithme : haval256,3
- Loop : 1000000 ;
- Execution time : 2713ms (0.002713ms/hash) ;
- Lenght : 64 ;
- Example : "hello_world" => 4b7481bcc69bce4efabe22cbfb3b25bb7499a2455075cd5bdb01ec4552000c05
=============> Algorithme : haval128,4
- Loop : 1000000 ;
- Execution time : 3404ms (0.003404ms/hash) ;
- Lenght : 32 ;
- Example : "hello_world" => e71d14a73f7fc3158ff7e351f2d22773
=============> Algorithme : haval160,4
- Loop : 1000000 ;
- Execution time : 3404ms (0.003404ms/hash) ;
- Lenght : 40 ;
- Example : "hello_world" => 0ec09eaf9f6fbaca69f7816a42f3949bae990440
=============> Algorithme : haval192,4
- Loop : 1000000 ;
- Execution time : 3447ms (0.003447ms/hash) ;
- Lenght : 48 ;
- Example : "hello_world" => cc7d242d1633c7cb4db616c7483f31b4615690e8148ba7fc
=============> Algorithme : haval224,4
- Loop : 1000000 ;
- Execution time : 3428ms (0.003428ms/hash) ;
- Lenght : 56 ;
- Example : "hello_world" => 7b87af3623bf1385bd1f6e78427d2308532df8b8e71846b905fdc897
=============> Algorithme : haval256,4
- Loop : 1000000 ;
- Execution time : 3462ms (0.003462ms/hash) ;
- Lenght : 64 ;
- Example : "hello_world" => c22d98db6bee1911537562db095901e19e1617fe6f637e5bd79c5ceb1514d0de
=============> Algorithme : haval128,5
- Loop : 1000000 ;
- Execution time : 4015ms (0.004015ms/hash) ;
- Lenght : 32 ;
- Example : "hello_world" => 9bb26ab7fb13542f3706acf3d765d610
=============> Algorithme : haval160,5
- Loop : 1000000 ;
- Execution time : 4033ms (0.004033ms/hash) ;
- Lenght : 40 ;
- Example : "hello_world" => fbb620633f34b19d755233f29e34d3613db44291
=============> Algorithme : haval192,5
- Loop : 1000000 ;
- Execution time : 4060ms (0.00406ms/hash) ;
- Lenght : 48 ;
- Example : "hello_world" => bc1054bd5a84c9d1de988973b6a74e1199090f8dacbcb2e6
=============> Algorithme : haval224,5
- Loop : 1000000 ;
- Execution time : 4058ms (0.004058ms/hash) ;
- Lenght : 56 ;
- Example : "hello_world" => 78d4e7a0751428085e1b64c2b4d4ed42cc50d7425e27bd33f95b54d9
=============> Algorithme : haval256,5
- Loop : 1000000 ;
- Execution time : 4069ms (0.004069ms/hash) ;
- Lenght : 64 ;
- Example : "hello_world" => eec53eea6e76e919baddf8f8898e730df27c719c5ba736eaafac1f4d8ffbc7b2
Total execution time : 143s
- - - ms/hash => algo
- - - 0.000507 => fnv1a32
- - - 0.000538 => joaat
- - - 0.000539 => crc32
- - - 0.000551 => crc32b
- - - 0.00056 => fnv132
- - - 0.000571 => fnv164
- - - 0.000574 => adler32
- - - 0.000593 => fnv1a64
- - - 0.000884 => md5
- - - 0.000917 => md4
- - - 0.00118 => sha1
- - - 0.001309 => tiger128,3
- - - 0.001323 => tiger160,3
- - - 0.001448 => ripemd128
- - - 0.001483 => tiger192,3
- - - 0.001487 => ripemd256
- - - 0.001507 => tiger128,4
- - - 0.001524 => tiger160,4
- - - 0.001721 => ripemd160
- - - 0.001723 => sha224
- - - 0.001736 => sha256
- - - 0.00174 => tiger192,4
- - - 0.001856 => ripemd320
- - - 0.002579 => haval160,3
- - - 0.002615 => haval128,3
- - - 0.002634 => haval224,3
- - - 0.002645 => haval192,3
- - - 0.002713 => haval256,3
- - - 0.003404 => haval128,4
- - - 0.003404 => haval160,4
- - - 0.003428 => haval224,4
- - - 0.003447 => haval192,4
- - - 0.003462 => haval256,4
- - - 0.003974 => sha512/256
- - - 0.003976 => sha512/224
- - - 0.003979 => sha384
- - - 0.004015 => haval128,5
- - - 0.004022 => sha512
- - - 0.004033 => haval160,5
- - - 0.004058 => haval224,5
- - - 0.00406 => haval192,5
- - - 0.004069 => haval256,5
- - - 0.004251 => gost
- - - 0.004273 => whirlpool
- - - 0.004365 => gost-crypto
- - - 0.004801 => snefru
- - - 0.004853 => snefru256
- - - 0.005317 => sha3-224
- - - 0.005394 => sha3-256
- - - 0.0055 => sha3-384
- - - 0.005587 => sha3-512
- - - 0.006157 => md2
```
-----------