昨日あたりから以前書いた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 なんですよね...