2013-03-19 26 views
13

http://www.php.net/manual/en/function.hash.php#73792には、md5()機能が同等のhash()機能より約3倍遅いことを示すテストが記載されています。「hash( 'md5'、 'string')」が「md5( 'string')」よりも高速なのはなぜですか?

この違いを説明するにはどうすればよいですか? md5()の機能は、何か異なるのですか?

+0

'MD5()' 'ハッシュ( "MD5")'の別名であり、従って、それを遅くので、それがあってもよいです。しかし、それについて私を引用しないでください。 –

+0

あなたが共有するリンクで使用されるデータは非常に小さいことに注意してください。大きいファイルのmd5を計算すると、その差は非常に小さくなります。 –

+0

C.大きなデータで試してみました。パーサは検索を2回行うので、PHPのエイリアスには時間がかかります。初めてエイリアスを検索し、元の機能を検索します。それはちょっとPHPの問題ですが、データ型を指定することはできません。 値キャストと同じことです。 (int)はintval()よりはるかに速くなります。エイリアスではありませんが、実行時間の差はかなり大きいです。 – imclickingmaniac

答えて

3

同じ!!!

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

と、これは私の結果である:私はこのコードを使用して、それをチェックするために大規模な文字列でそれをテストする必要があり、非常に類似し

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

+0

ああ、面白い!したがって、小さな文字列の違いは、md5()がhash( "md5"、)のエイリアスであることに起因します。 – Pim

+1

本当の質問ではありませんか? –

+0

@Pimそれは私にそうだよ –

5

はい、100%正しい ...ほとんどは、彼らはいくつかのバージョンでは若干速く同じとmd5実行されPHPの安定版を再送にあなたはまだPHPPHP 5.2.2からPHP 5.1.2 としてのPHP初期のバージョンを使用している場合には、

Here is a simple test in most PHP version

また、結果に影響を与えているベンチマーク方法が間違っている注意する必要があると位置を変える...これは、より良い結果を取得する方法です。

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

出力

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

関連する問題