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