2013-03-19 9 views
13

Su http://www.php.net/manual/en/function.hash.php#73792 viene indicato un test che mostra che la funzione md5() è circa 3 volte più lenta della funzione equivalente hash().Perché "hash ('md5', 'string')" più veloce di "md5 ('string')"?

Che cosa può spiegare questa differenza? Cosa fa la funzione in modo diverso e/o più?

+0

Può essere perché 'md5()' è un alias di 'hash ("MD5",)' e quindi lo rallenta. Non citarmi su questo comunque. –

+0

Si noti che i dati utilizzati nel collegamento condiviso sono molto piccoli - se si calcola l'md5 di un file di grandi dimensioni, la differenza dovrebbe essere molto piccola. –

+0

Come C. ha detto di provarlo su dati più grandi. Ogni alias in php impiega più tempo perché il parser esegue la ricerca due volte. La prima volta cerca l'alias e quindi la funzione originale. È un problema di php, ma permette di non specificare il tipo di dati. La stessa cosa che hai per il cast di valore. (int) sarà molto più veloce di intval(). Non è un alias, ma la differenza di tempo di esecuzione è abbastanza grande. – imclickingmaniac

risposta

3

Ci sono lo stesso !!! è necessario testare con stringa di grandi dimensioni per controllarlo, io uso questo codice:

<?php 

$s=""; 
for ($i=0;$i<1000000;$i++) 
$s.=$i; 
$time=microtime(1); 
    hash('md5', $s); 
echo microtime(1)-$time,': hash/md5<br>'; 

$time=microtime(1); 

md5($s); 
echo microtime(1)-$time,': md5<br>'; 

$time=microtime(1); 
hash('sha1', $s); 
echo microtime(1)-$time,': hash/sha1<br>'; 

$time=microtime(1); 
sha1($s); 
echo microtime(1)-$time,': sha1<br>'; 
?> 

e questo è il mio risultato:

0.015523910522461: hash/md5 
0.01521897315979: md5 
0.020196914672852: hash/sha1 
0.020323038101196: sha1 

Molto simile !!!

+0

Ah, interessante ! Quindi la differenza per le stringhe piccole è causata dal fatto che md5() è un alias di hash ("md5",). – Pim

+1

Quindi .. non è una domanda reale? –

+0

@Pim mi sembra così –

5

Si corretta al 100% ... che è se si sta ancora utilizzando PHP versione precedente di PHP come PHP 5.1.2-PHP 5.2.2 in più risentono versione stabile di PHP sono la stessa cosa e md5 run leggermente più veloce in alcune versioni

Here is a simple test in most PHP version

è inoltre necessario notare che il metodo punto di riferimento è sbagliato e cambiando posizione influisce sul risultato ... Questo è come ottenere un risultato migliore.

set_time_limit(0); 
echo "<pre>"; 

function m1($total) { 
    for($i = 0; $i < $total; $i ++) 
     hash('md5', 'string'); 
} 

function m2($total) { 
    for($i = 0; $i < $total; $i ++) 
     md5('string'); 
} 

function m3($total) { 
    for($i = 0; $i < $total; $i ++) 
     hash('sha1', 'string'); 
} 

function m4($total) { 
    for($i = 0; $i < $total; $i ++) 
     sha1('string'); 
} 

function m5($total) { 
    for($i = 0; $i < $total; $i ++) 
     hash('md5', $i); 
} 

function m6($total) { 
    for($i = 0; $i < $total; $i ++) 
     md5($i); 
} 

function m7($total) { 
    for($i = 0; $i < $total; $i ++) 
     hash('sha1', $i); 
} 

function m8($total) { 
    for($i = 0; $i < $total; $i ++) 
     sha1($i); 
} 

$result = array(
     'm1' => 0, 
     'm2' => 0, 
     'm3' => 0, 
     'm4' => 0, 
     'm5' => 0, 
     'm6' => 0, 
     'm7' => 0, 
     'm8' => 0 
); 

$total = 10000; 

for($i = 0; $i < 100; ++ $i) { 
    foreach (array_keys($result) as $key) { 
     $alpha = microtime(true); 
     $key($total); 
     $result[$key] += microtime(true) - $alpha; 
    } 
} 

echo '<pre>'; 
echo "Single Run\n"; 
print_r($result); 
echo '</pre>'; 

uscita

Single Run 
Array 
(
    [m1] => 0.58715152740479     <--- hash/md5/string 
    [m2] => 0.41520881652832     <--- md5/string 
    [m3] => 0.79592990875244     <--- hash/sha1/string 
    [m4] => 0.61766123771667     <--- sha1/string 
    [m5] => 0.67594528198242     <--- hash/md5/$i 
    [m6] => 0.51757597923279     <--- md5/$i 
    [m7] => 0.90692067146301     <--- hash/sha1/$i 
    [m8] => 0.74792814254761     <--- sha1/$i 

) 

Live Test