Visualiser une révision

[PHP] Tester la vitesse de hashage des différents algorithmes

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
```
-----------