【Ruby】画像のMD5ハッシュ値を検証する方法

Digest::MD5.file は、RubyのDigestライブラリにおけるメソッドの一つで、ファイルの内容を読み込んでそのMD5ハッシュ値を確かめることができます。

2024年03月20日
関連記事

いきなりMD5と、古めな技術となってしまいましたが…
現在の業務で出てきたので軽く紹介します。

ポイントはざっとこんな感じ。

  • 画像ストレージに重複する画像がたくさんあるよ
  • 定期的に重複を解消する非同期処理を実行するよ

MD5とは?

Message Digest Algorithm 5 を短くまとめたやつです。
今回は画像を題材にして説明していきますが、要は デジタルデータから16バイトのハッシュ値を生成するための暗号化ハッシュアルゴリズムです。

まーだ難しいですね。
もう少しざっくりと。

  1. 元のデータが少しでも異なれば全く違うものになります。
  2. データが同じものであれば、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枚に時間をかけてられないのです。
以下、ポイントのおさらい。

  1. 日々大量の画像がストレージに送られてくる
  2. 定期的に非同期処理を走らせて、重複する画像を削除。

ベンチマーク

興味ある方はお手元の 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秒
筆者情報
IT業界経験6年目のフルスタックエンジニア。
フロントエンドを軸として技術を研鑽中でございます。