【Ruby】画像のMD5ハッシュ値を検証する方法
Digest::MD5.file は、RubyのDigestライブラリにおけるメソッドの一つで、ファイルの内容を読み込んでそのMD5ハッシュ値を確かめることができます。
いきなりMD5と、古めな技術となってしまいましたが…
現在の業務で出てきたので軽く紹介します。
ポイントはざっとこんな感じ。
- 画像ストレージに重複する画像がたくさんあるよ
- 定期的に重複を解消する非同期処理を実行するよ
MD5とは?
Message Digest Algorithm 5 を短くまとめたやつです。
今回は画像を題材にして説明していきますが、要は デジタルデータから16バイトのハッシュ値を生成する
ための暗号化ハッシュアルゴリズムです。
まーだ難しいですね。
もう少しざっくりと。
- 元のデータが少しでも異なれば全く違うものになります。
- データが同じものであれば、MD5は毎回同じ文字列を生成します。
こんな温度感で認識してもらえれば大丈夫。
使い方
使い方はとっても簡単。お手元のrails consoleで試してみよう。
文字列の場合
Digest::MD5.hexdigest('md5をためしたーーーーい')
ファイルの場合
Digest::MD5.file('ファイルのパス').hexdigest
SHA使えよ!!
MD5は同じデータからはいつも同じハッシュ値が返ってくるんだけど
実はちょっと古くて、安全性が保証されてないのが現状です。ぶっちゃけた話、非推奨です。
ちょっと違うデータからも同じハッシュ値が出ちゃうことがある。だから、セキュリティを意識しなきゃいけない場合、SHA-256みたいな新しいやつの方が安全だよ、って話。
SHAを使いましょう。正解。
使い方
こちらも使い方はとっても簡単。同じようにお手元のrails consoleで試してみよう。
文字列の場合
Digest::SHA256.hexdigest('md5をためしたーーーーい')
ファイルの場合
Digest::SHA256.file('ファイルのパス').hexdigest
場合によりけりです
少し迷ったんですが、やっぱパフォーマンス重視で考えた時に、MD5を採用することにしました。
めっちゃ画像多いのに、1枚に時間をかけてられないのです。
以下、ポイントのおさらい。
- 日々大量の画像がストレージに送られてくる
- 定期的に非同期処理を走らせて、重複する画像を削除。
ベンチマーク
興味ある方はお手元の rails console
で試してみましょう。
require 'digest'
require 'benchmark'
data = "速度検証のためのデータだぜーーーーーーーー!!!!" * 1000
# MD5とSHA-256の計算速度を比較
Benchmark.bmbm do |x|
x.report("MD5: ") { 100.times { Digest::MD5.hexdigest(data) } }
x.report("SHA-256:") { 100.times { Digest::SHA256.hexdigest(data) } }
end
出力結果
Rehearsal --------------------------------------------
MD5: 0.028843 0.000000 0.028843 ( 0.028660)
SHA-256: 0.201331 0.002566 0.203897 ( 0.203921)
----------------------------------- total: 0.232740sec
user system total real
MD5: 0.029918 0.000060 0.029978 ( 0.029977)
SHA-256: 0.126102 0.000000 0.126102 ( 0.126091)
画像データで比較すると、やっぱ結構時間かかりそうですね。
- MD5: 約0.03秒
- SHA-256: 約0.20秒