Perlモジュールで暗号化 - サムチェック編
暗号化から少し離れますが、Digest::MD5を使ったサムチェックの方法を解説しておきます。
6-1. サムチェックとは
サムチェックとは、データを送受信する際の検出方法の1つです。
具体的には、たとえばダウンロードさせるファイルが、オリジナルのものか否かをチェックしたり、あるいは複数ある画像・動画ファイルから同一のものを検出したりする際に利用します。つまり、バイナリファイルの同一性をチェックする際に有効なものです。
つまり、MD5方式に変換することでユニークな値を得て、同一か否かを判別する訳です。
具体的には、たとえばダウンロードさせるファイルが、オリジナルのものか否かをチェックしたり、あるいは複数ある画像・動画ファイルから同一のものを検出したりする際に利用します。つまり、バイナリファイルの同一性をチェックする際に有効なものです。
つまり、MD5方式に変換することでユニークな値を得て、同一か否かを判別する訳です。
ここでは、複数ある画像の中から同一のものを検出するコード例を考えてみます。
例えば、以下にそれぞれファイル名の異なる4つの画像ファイルがあります。今回はこの中から、同一の画像を探し出します。 まあ、以下のような4つ程度ならば、人間の「目」で見ればすぐに分かりますが、1万個の中から探し出すとすると、やはりプログラムの力を借りる他ありません。
例えば、以下にそれぞれファイル名の異なる4つの画像ファイルがあります。今回はこの中から、同一の画像を探し出します。 まあ、以下のような4つ程度ならば、人間の「目」で見ればすぐに分かりますが、1万個の中から探し出すとすると、やはりプログラムの力を借りる他ありません。
dog1.gif | dog2.gif | dog3.gif | dog4.gif |
---|---|---|---|
上記の画像ファイルをそれぞれDigest::MD5で文字列化し、同一のものを探しだすコードを考えてみます。
最初に、まず画像ファイルをDigest::MD5で文字列化する方法です。
このような場合は、OO方式を使用します。
このような場合は、OO方式を使用します。
use strict; # モジュール宣言 use Digest::MD5; # 画像ファイル my $file = 'dog1.gif'; # データ読み込み open(IN,"$file"); binmode(IN); # MD5変換 my $digest = Digest::MD5->new->addfile(*IN)->hexdigest; close(IN); # 出力 print "$digest : $file\n";
> d2094ae7f078a7d3159066e023607acc : dog1.gif
上記ように、dog1.gifという画像ファイル(バイナリファイル)をMD5方式で表現することができました。
6-2. 同一画像を検出する
それでは、同一画像を検出するコード例です。
全体の画像ファイルを順次読み込みながら、各MD5値を取得し、同一の要素のものだけを表示するプログラムを書いてみましょう。
全体の画像ファイルを順次読み込みながら、各MD5値を取得し、同一の要素のものだけを表示するプログラムを書いてみましょう。
use strict; # モジュール宣言 use Digest::MD5; # 対象画像ファイル my @file = qw(dog1.gif dog2.gif dog3.gif dog4.gif); # 各画像ファイルを読み込み my (%file,%uniq); for (@file) { # 画像を読む open(IN,"$_") or die; binmode(IN); my $digest = Digest::MD5->new->addfile(*IN)->hexdigest; close(IN); # MD5値が重複するもの if (defined($file{$digest})) { $uniq{$digest}++; } # MD5値に対するファイル名を覚えておく $file{$digest} .= "$_,"; } # 重複したものを展開 for ( keys %uniq ) { print "$_ : $file{$_}\n"; }
> d2094ae7f078a7d3159066e023607acc : dog1.gif,dog4.gif,
上記のコードを実行することで、do1.gif と dog4.gif が同一画像であることが分かりました。