MD5ハッシュでリネーム

#!/usr/local/bin/perl

use strict;
use warnings;

use Digest;

if(@ARGV){
	foreach(@ARGV){
		my $ext = substr $_, (rindex $_, '.');
		open FILE, $_;
		binmode FILE;
		my $ctx = Digest->new('MD5');
		$ctx->addfile('FILE');
		close FILE;
		rename $_, $ctx->hexdigest.$ext;
	}
}
else{
	opendir DIR, "./";
	my @files = readdir DIR;
	closedir DIR;
	foreach(@files){
		next if /^\.\.?$/;
		next unless /.*\.jpe?g$/i || /.*\.gif$/i || /.*\.png$/i;
		my $ext = substr $_, (rindex $_, '.');
		open FILE, $_;
		binmode FILE;
		my $ctx = Digest->new('MD5');
		$ctx->addfile('FILE');
		close FILE;
		rename $_, $ctx->hexdigest.$ext;
	}
}

__END__

作成中のコードに、ファイルの区別用にMD5ハッシュ関数の値をファイル名として使う部分があって、実際にそのコードも書いてみたんだけど… うーん、MD5ハッシュの衝突を見つける方法が見つかってるし、SHA-1あたりにしておこうかな… reducedならともかく、完全版のSHA-1はまだ破られてないようだし。

/.J: SHA-0、MD5、 MD4にコリジョン発見、reduced SHA-1も
MD5とMD4での複数のコリジョン発見[PDF]