2013-03-19 2 views
13

Auf http://www.php.net/manual/en/function.hash.php#73792 gibt es einen Test, der zeigt, dass die md5() Funktion etwa 3 mal langsamer als die entsprechende hash() Funktion ist.Warum ist "hash ('md5', 'string')" schneller als 'md5 (' string ') "?

Was kann diesen Unterschied erklären? Was macht die md5() Funktion anders und/oder mehr?

+0

Es kann sein, weil 'md5()' ein Alias ​​von 'Hash ist ("md5")' und deshalb verlangsamt es. Ziehe mich nicht darauf an. –

+0

Beachten Sie, dass die Daten, die in der von Ihnen freigegebenen Verbindung verwendet werden, sehr klein sind - wenn Sie die MD5 einer großen Datei berechnen, sollte der Unterschied sehr klein sein. –

+0

Wie C. sagte, versuchen Sie es auf größeren Daten. Jeder Alias ​​in PHP benötigt mehr Zeit, da der Parser die Suche zweimal durchführt. Zuerst sucht es nach Alias ​​und dann nach Originalfunktion. Es ist ein PHP-Problem, aber es erlaubt nicht den Datentyp anzugeben. Das gleiche, was Sie für Wert-Cast haben. (int) ist viel schneller als intval(). Es ist kein Alias, aber der Ausführungszeitunterschied ist ziemlich groß. – imclickingmaniac

Antwort

3

Es sind die gleichen !!! Sie müssen es mit großen Zeichenfolge testen, um es zu überprüfen, verwende ich diesen Code:

<?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>'; 
?> 

und das ist mein Ergebnis:

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

Sehr ähnlich !!!

+0

Ah, interessant ! Der Unterschied für kleine Strings liegt also darin, dass md5() ein Alias ​​von Hash ("md5") ist. – Pim

+1

Also .. keine echte Frage? –

+0

@Pim es scheint mir so –

5

Ja 100% richtig ... das ist, wenn Sie noch frühe Version von PHP wie PHP 5.1.2-PHP 5.2.2 PHP verwenden in stabilste Version von PHP übel nehmen sie gleich und md5 laufen etwas schneller in einigen Versionen sind

Here is a simple test in most PHP version

Sie müssen auch, dass bench mark Verfahren zu beachten ist falsch und Wechselposition das Ergebnis beeinflussen ... So besseres Ergebnis zu erzielen.

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>'; 

Ausgabe

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