Perlモジュールで暗号化 - サムチェック編
暗号化から少し離れますが、Digest::MD5を使ったサムチェックの方法を解説しておきます。

6-1. サムチェックとは

サムチェックとは、データを送受信する際の検出方法の1つです。
具体的には、たとえばダウンロードさせるファイルが、オリジナルのものか否かをチェックしたり、あるいは複数ある画像・動画ファイルから同一のものを検出したりする際に利用します。つまり、バイナリファイルの同一性をチェックする際に有効なものです。
つまり、MD5方式に変換することでユニークな値を得て、同一か否かを判別する訳です。
ここでは、複数ある画像の中から同一のものを検出するコード例を考えてみます。
例えば、以下にそれぞれファイル名の異なる4つの画像ファイルがあります。今回はこの中から、同一の画像を探し出します。 まあ、以下のような4つ程度ならば、人間の「目」で見ればすぐに分かりますが、1万個の中から探し出すとすると、やはりプログラムの力を借りる他ありません。
dog1.gif dog2.gif dog3.gif dog4.gif
dog1.gif dog2.gif dog3.gif dog4.gif
上記の画像ファイルをそれぞれDigest::MD5で文字列化し、同一のものを探しだすコードを考えてみます。
最初に、まず画像ファイルをDigest::MD5で文字列化する方法です。
このような場合は、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方式で表現することができました。
pagetop

6-2. 同一画像を検出する

それでは、同一画像を検出するコード例です。
全体の画像ファイルを順次読み込みながら、各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 が同一画像であることが分かりました。
pagetop