Go for it!

モーターサイクルと自転車とキャンプの日々。

PHPでハッシュの生成

ふと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]

ベンチマークの結果はというと…。

実行回数MD5SHA1
1回目4.23s4.78s
2回目4.46s4.71s
3回目4.32s4.52s
4回目4.24s4.70s
5回目4.29s4.31s
6回目4.17s4.43s

6回実行してすべてMD5が勝利。

平均すると6%ほどMD5の方が高速で、単純にハッシュを生成する場合には、SHA1よりMD5のほうがパフォーマンスに優れます。

以下素人考えの能書きです。 間違ってたらコメント/トラバでご指摘くださいm(__)m

しかし、MD5は強衝突耐性に欠けており、同じハッシュ値を持った別のデータ列を比較的容易に探すことが出来るようです(wikipedia:MD5)。

例えばメールアドレスからハッシュを生成するなど、ユーザ入力からハッシュ生成を行うケースではMD5を用いてはいけないということを意味しており、その場合にはSHA1やSHA256など、別のアルゴリズムを使用すべきです。

何が言いたいかというと、MD5が速いからMD5だけ使っていれば良いわけではなくて、元のデータ列、ハッシュの利用方法などを吟味した上で、ハッシュアルゴリズムを選ぶ必要がありますね、ということです。

[ad#text_wide]