7

inputStreamハッシュを計算してファイルをディスクに保存するために使用したい があります。効率の良い方法を知りたいです。それを同時に実行するために何らかのタスクを使用する必要がありますか、ストリームパスをsaveFileメソッド用とメソッド用の 2 つのストリームに複製するcomputeHash必要がありますか、それとも何か他のことを行う必要がありますか?

4

5 に答える 5

3

ブロック レベルで動作するハッシュ アルゴリズムの使用についてはどうでしょうか。(TransformBlock を使用して) ブロックをハッシュに追加し、その後、ストリーム内の foreach ブロックのファイルにブロックを書き込むことができます。

未テストのラフショット:

using System.IO;
using System.Security.Cryptography;

...

public byte[] HashedFileWrite(string filename, Stream input)
{
    var hash_algorithm = MD5.Create();

    using(var file = File.OpenWrite(filename))
    {
        byte[] buffer = new byte[4096];
        int read = 0;

        while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
        {
            hash_algorithm.TransformBlock(buffer, 0, read, null, 0);
            file.Write(buffer, 0, read);
        }

        hash_algorithm.TransformFinalBlock(buffer, 0, read);
    }

    return hash_algorithm.Hash;
}
于 2012-06-20T18:41:16.950 に答える
1

これは最善のオプションではないかもしれませんが、Stream実際にファイルをディスクに書き込むためのパススルーとなる子孫/ラッパーを選択します。

それで:

  • から派生Stream
  • そのような1つのメンバーがStream _inner;書き込みのターゲットストリームになります
  • 実装Write()および関連するすべてのもの
  • Write()データのブロックをハッシュして呼び出します_inner.Write()

使用例

Stream s = File.Open("infile.dat");
Stream out = File.Create("outfile.dat");
HashWrapStream hasher = new HashWrapStream(out);
byte[] buffer=new byte[1024];
int read = 0;
while ((read=s.Read(buffer)!=0) 
{
    hasher.Write(buffer);
}
long hash=hasher.GetComputedHash(); // get actual hash
hasher.Dispose();
s.Dispose();
于 2012-06-20T21:28:53.880 に答える
-1

byte[]ハッシュするには、ストリームのバイトを に詰め込む必要があります。

于 2012-06-20T18:17:37.120 に答える