ファイルのCRC32/md5/sha1/sha256/sha384/sha512を計算するために使用する簡単なアプリケーションを設計しようとしていますが、私はいくつかのロードブロッキングを実行しました。これはC#で行われています。1つのファイルを同時に複数の方法でハッシュするには?
これをできるだけ効率的にやりたいと思っています。元の考えでは、処理前にまずメモリースティックにファイルを読み込むことでしたが、すぐに非常に大きなファイルがメモリ不足になることがわかりました非常に迅速に。ですから、代わりにファイルストリームを使用する必要があるようです。問題は、一度に1つのハッシュ関数しか実行できないということです。ファイルストリームを使用すると、各ハッシュが完了するまでに時間がかかります。
ファイルの小さなビットをメモリに読み込み、6つのアルゴリズムすべてで処理してから、別のチャンクに移動するとどうなりますか?またはハッシュがうまくいかないのですか?
これは、ファイルをメモリに読み込む私の最初の試みでした。私は前のMemoryStreamにハッシュアルゴリズムを実行するメモリにCDイメージを読み込むしようとしたとき、それは失敗しました:
private void ReadToEndOfFile(string filename)
{
if (File.Exists(filename))
{
FileInfo fi = new FileInfo(filename);
FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[16 * 1024];
//double step = Math.Floor((double)fi.Length/(double)100);
this.toolStripStatusLabel1.Text = "Reading File...";
this.toolStripProgressBar1.Maximum = (int)(fs.Length/buffer.Length);
this.toolStripProgressBar1.Value = 0;
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = fs.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
this.toolStripProgressBar1.Value += 1;
}
_ms = ms;
}
}
}
これはMD5を使用して動作するようにしましたが、プログラムが実行されますが、不正なハッシュが生成されているようです。 私のコードへのリンクは次のとおりです。[link](http://pastebin.com/i3iPwYZv) – agent154
'TransformFinalBlock'を呼び出すときは、' buffer.Length'ではなく 'read'を使用してください。 –
ありがとう!私は昨夜、これを悩ましていました。それを働かせるために何か愚かな探して一緒にハッキングを終了したが、私は助けることができませんでしたが、それは不要だったと感じました。 最後の配列が完全に読み込まれていたのは、最後のチャンクが小さすぎても読み込んでいたためです。最後の部分のサイズが最後の部分のサイズと等しくなるように新しいバイト配列を作成するようになりました。 – agent154