4

非常に大きなファイルで使用されるプログラムがあります (現在のテスト データは 250GB です)。これらのファイルの MD5 ハッシュと SHA1 ハッシュの両方を計算できる必要があります。現在、私のコードはストリームを MD5.Create().ComputeHash(Stream stream) にドロップし、SHA1 についても同じです。これらは、私が知る限り、ファイルを 4096 バイトのブロック単位で、ストリームの最後まで、ハッシュ関数内部のバッファーに読み取ります。

問題は、これを次々に行うには非常に長い時間がかかることです! 新しいブロックをバッファに読み込む前に、データをバッファに取り込み、そのバッファを両方のアルゴリズムに提供する方法はありますか?

私は経験豊富なコーダーではないので、徹底的に説明してください。

4

1 に答える 1

10

もちろん。TransformBlock繰り返し呼び出しTransformFinalBlock、最後に使用Hashして、最終的なハッシュを取得できます。次のようなものです:

using (var md5 = MD5.Create()) // Or MD5Cng.Create
using (var sha1 = SHA1.Create()) // Or SHA1Cng.Create
using (var input = File.OpenRead("file.data"))
{
    byte[] buffer = new byte[8192];
    int bytesRead;
    while ((bytesRead = input.Read(buffer, 0, buffer.Length()) > 0)
    {
        md5.TransformBlock(buffer, 0, bytesRead, buffer, 0);
        sha1.TransformBlock(buffer, 0, bytesRead, buffer, 0);
    }
    // We have to call TransformFinalBlock, but we don't have any
    // more data - just provide 0 bytes.
    md5.TransformFinalBlock(buffer, 0, 0, buffer, 0);
    sha1.TransformFinalBlock(buffer, 0, 0, buffer, 0);

    byte[] md5Hash = md5.Hash;
    byte[] sha1Hash = sha1.Hash;
}

MD5Cng.Createとの呼び出しは、とSHA1Cng.Createによって返される実装よりも高速である可能性が高いネイティブ実装の周りにラッパーを作成しますが、移植性は少し低くなります (PCL など)。MD5.CreateSHA1.Create

于 2013-02-15T22:41:47.840 に答える