ふとMD5とSHA1のどっちが速いんだろう?と思い立ち、簡単にベンチマークを取ってみた。
数学的な内容は理解してないのだが、SHA1のほうが長いアウトプットを返すので処理が重そうなイメージ(想像です!)。とりあえずランダムを元に50万回ほどハッシュ計算させてみる。
[code lang=‘php’] for ($i=0; $i<500000; $i++) { md5(rand(0,1000)); } [/code]
[code lang=‘php’] for ($i=0; $i<100000; $i++) { sha1(rand(0,1000)); } [/code]
ベンチマークの結果はというと…。
実行回数 | MD5 | SHA1 |
---|---|---|
1回目 | 4.23s | 4.78s |
2回目 | 4.46s | 4.71s |
3回目 | 4.32s | 4.52s |
4回目 | 4.24s | 4.70s |
5回目 | 4.29s | 4.31s |
6回目 | 4.17s | 4.43s |
6回実行してすべてMD5が勝利。
平均すると6%ほどMD5の方が高速で、単純にハッシュを生成する場合には、SHA1よりMD5のほうがパフォーマンスに優れます。
以下素人考えの能書きです。 間違ってたらコメント/トラバでご指摘くださいm(__)m
しかし、MD5は強衝突耐性に欠けており、同じハッシュ値を持った別のデータ列を比較的容易に探すことが出来るようです(wikipedia:MD5)。
例えばメールアドレスからハッシュを生成するなど、ユーザ入力からハッシュ生成を行うケースではMD5を用いてはいけないということを意味しており、その場合にはSHA1やSHA256など、別のアルゴリズムを使用すべきです。
何が言いたいかというと、MD5が速いからMD5だけ使っていれば良いわけではなくて、元のデータ列、ハッシュの利用方法などを吟味した上で、ハッシュアルゴリズムを選ぶ必要がありますね、ということです。
[ad#text_wide]