SHA-256 その後

昨日あたりから以前書いたSHA-256 - 讃容日記へのアクセスが増えているので、ちょっとだけフォロー。


あれから1年半で PHP で SHA-256 を使う手段も増えました。代表的な関数を3つ挙げます。


これからは PHP 5.1.2 から標準添付されている hash エクステンションの関数を使うのが主流になっていくと思われます。
hash エクステンションのメリットは Mhash 同様、SHA-256 以外の多くのハッシュ関数が使えることに加え、hash_init() で得たコンテキストに hash_update() でデータを投入することで逐次ハッシュの更新ができることです。
mhash 関数ではデータを一度に全て渡す必要があったため、メモリを大量に必要とする場合がありました。他の言語では昔からできていたことが hash エクステンションによって、ようやくできるようになったわけです。


で、hash エクステンションがサポートしているアルゴリズムベンチマークをとってみました。

<?php
$data = file_get_contents('/dev/urandom', false, null, 0, 1024);
//echo bin2hex($data), "?n";
foreach (hash_algos() as $algo) {
    $hash = hash($algo, $data, true);
    $bits = strlen($hash) * 8;
    $begin = microtime(true);
    for ($i = 0; $i < 100000; $i++) {
        hash($algo, $data, true);
    }
    $end = microtime(true);
    $time = $end - $begin;
    printf("%s (%d): %0.6f?n", $algo, $bits, $time);
}

iMac G5/2GHz での結果:

md2 (128): 129.660365
md4 (128): 3.077290
md5 (128): 5.870644
sha1 (160): 4.944520
sha256 (256): 12.697866
sha384 (384): 8.571647
sha512 (512): 8.582493
ripemd128 (128): 6.937646
ripemd160 (160): 8.316292
ripemd256 (256): 6.394858
ripemd320 (320): 8.374309
whirlpool (512): 15.698329
tiger128,3 (128): 5.907927
tiger160,3 (160): 5.908791
tiger192,3 (192): 5.928313
tiger128,4 (128): 7.079001
tiger160,4 (160): 7.112705
tiger192,4 (192): 7.097847
snefru (256): 35.737027
gost (256): 17.967794
adler32 (32): 6.106859
crc32 (32): 2.773090
crc32b (32): 2.778870
haval128,3 (128): 10.051863
haval160,3 (160): 10.093966
haval192,3 (192): 10.086259
haval224,3 (224): 10.080924
haval256,3 (256): 10.102014
haval128,4 (128): 14.664323
haval160,4 (160): 14.685449
haval192,4 (192): 14.641130
haval224,4 (224): 14.670251
haval256,4 (256): 14.679085
haval128,5 (128): 17.393401
haval160,5 (160): 17.371219
haval192,5 (192): 17.396049
haval224,5 (224): 17.399706
haval256,5 (256): 17.369836


SHA-256 より SHA-384/SHA-512 のほうが時間が短くなってます。アルゴリズムによってはハッシュ長が異なっても計算時間が変わらないものがありますが、これは内部では全く同じ計算をして、出力時に調整しているためです。


Internet Watch の記事を参考にすると Tiger が良さげなんですが、SHA ファミリーは合衆国政府標準なんで、多少欠点があっても普及するのは SHA なんですよね...