2013-03-19 25 views
13

http://www.php.net/manual/en/function.hash.php#73792, md5() işlevinin, eşdeğer hash() işlevinden yaklaşık 3 kat daha yavaş olduğunu gösteren bir testi belirtir.Neden "karma ('md5', 'string')" md5'ten ("string ')" daha hızlı "?

Bu farkı nasıl açıklayabiliriz? md5() işlevi farklı ve/veya daha fazlasını yapıyor?

+0

'MD5()' 'karma ("MD5") 'ait bir takma ve bu nedenle bunu yavaşlatır çünkü olabilir. Bununla ilgili bana alıntı yapma. –

+0

Paylaştığınız bağlantıda kullanılan verilerin çok küçük olduğunu unutmayın - büyük bir dosyanın md5 değerini hesaplarsanız, fark çok küçük olmalıdır. –

+0

C. Daha büyük veri üzerinde denemeyi söylediği gibi. Php'deki her diğer ad daha fazla zaman alır çünkü ayrıştırıcı aramayı iki kez yapar. İlk kez diğer adı ve ardından orijinal işlevini arar. Bu tür bir php problemi, ancak veri tipini belirtmemize izin veriyor. Değer için sahip olduğunuzla aynı şey. (int) sonra intval() daha hızlı olacaktır. Takma ad değil, ancak yürütme süresi farkı oldukça büyük. – imclickingmaniac

cevap

3

Aynı şey var !!!

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

ve bu benim sonucudur: Eğer ben bu kodu kullanın, bunu kontrol etmek büyük bir dize ile test gerek çok benzer

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

!!!

+0

Ah’nın güncel sürümlerinde biraz ! Dolayısıyla, küçük dizeler arasındaki fark, md5() 'in bir karma takma adıdır ("md5",). – Pim

+1

Yani .. gerçek bir soru değil mi? –

+0

@Pim bana öyle görünüyor –

5

Evet% 100 doğru ... En bazı sürümlerinde biraz daha hızlı aynı ve md5 yayınlanabilecekleri PHP kararlı sürümü yeniden gönderilmesini de yine PHP böyle PHP 5.2.2-PHP 5.1.2 olarak PHP erken sürümünü kullanıyorsanız olmasıdır

Here is a simple test in most PHP version

Ayrıca bu röper yöntemi yanlış ve pozisyon sonucunu etkileyebilecek değişen unutmayın gerekir ... Bu daha iyi sonuç almak için nasıl.

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

Çıkış

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

İlgili konular