MD5 から途切れたファイルのサイズを調べるツール

ファイルが途切れていたり、後ろにゴミが付いてる時の md5 を計算して、期待する md5 と比較するツールです。 (md5incomplete.php)

プログラム等を tarball で公開していると、たまに md5 が合わないといった問い合わせを受けるのですが、サイズが幾つで切れてますよとこちらから指摘すると大変驚かれて楽しいので、そういうツールを作ってました。
(ファイルの日付を見たら 2012-12-26 20:48 なので半年前)

という訳でプログラムを晒します。

やってる事

期待する md5 文字列を引数で渡すと、
ファイル先頭1byteだけの md5 と比較。次は 2byte 分の md5 と比較。。といった具体で 1byte ずつ増やしながら md5 を比較して一致したサイズを表示します。

ついでに、サイズが足りないパターンだけでなく、256byte まで増やしての比較もしますが、同じ値が連続する前提で計算するので、単なるおまけです。

md5incomplete.php

<?php

if ($argc !== 3) {
  echo "php md5incomplete.php swfed-0.60.tar.gz 13899229c30408082573e94f44a735b\
3\n";
  exit (1);
}

list($progname, $filename, $file_md5) = $argv;

$filedata = file_get_contents($filename);
$filelength = strlen($filedata);

echo "minus\n";
for ($i = $filelength ; $i > 0 ; $i--) {
    if (md5(substr($filedata, 0, $i)) === $file_md5) {
        echo "$i/$filelength\n";
        exit (0);
    }
}

echo "plus\n";
for ($i = 1 ; $i <= 256 ; $i++) {
    for ($c = 0 ; $c < 256 ; $c++) {
        if (md5(str_pad($filedata, $i, chr($c)))  === $file_md5) {
            echo "$filelength+$i/256 code=$c\n";
            exit (0);
        }
    }
}

echo "Not found\n";