は(EDIT:私はそれは不要だ疑いがあるが、それは良い習慣だ:)
あなたはあなただけの部分をハッシュする必要があるにもかかわらず、全体バッファ用のComputeHashを呼び出している今、ハッシュアルゴリズムの廃棄あなたが読んだバッファ。さらに、Readの呼び出しごとに新しいハッシュを計算しています。
はここでハッシュを計算するために、いくつかの本当に簡単なコードです:
using System;
using System.IO;
using System.Security.Cryptography;
class Test
{
static void Main()
{
byte[] plaintext = File.ReadAllBytes("b.txt");
using (MD5 md5 = MD5.Create())
{
byte[] md5Hash = md5.ComputeHash(plaintext);
Console.WriteLine(BitConverter.ToString(md5Hash));
}
using (SHA1 sha1 = SHA1.Create())
{
byte[] sha1Hash = sha1.ComputeHash(plaintext);
Console.WriteLine(BitConverter.ToString(sha1Hash));
}
}
}
これは、ウィキペディアごとに結果を与える - b.txt
はそれの終わりに改行を持つべきではないことに注意してください。
で開始するバイナリデータを取得する別の方法は次のようになります。これはただ一度にハッシュを計算する簡単な方法であることを
byte[] plaintext = Encoding.ASCII.GetBytes(
"The quick brown fox jumps over the lazy dog");
注意。あなたがストリーミング方法でそれをやりたい場合(つまり、データを読み込んだりハッシュに追加したり、もっと多くのデータを読み込んだりするなど)、ComputeHash(Stream)
オーバーロードを使うこともできますし(データをそこにプッシュする我々はすべての出力を必要としない、と我々は最終ブロック内のすべてのデータを変換していないので、我々はTransformBlock
にnull
を渡す方法に注意してください
using System.Text;
class Test
{
static void Main()
{
using (MD5 md5 = MD5.Create())
using (SHA1 sha1 = SHA1.Create())
using (Stream input = File.OpenRead("b.txt"))
{
// Artificially small to make sure there's
// more than one read
byte[] buffer = new byte[4];
int bytesRead;
while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
{
md5.TransformBlock(buffer, 0, bytesRead, null, 0);
sha1.TransformBlock(buffer, 0, bytesRead, null, 0);
}
md5.TransformFinalBlock(buffer, 0, 0);
sha1.TransformFinalBlock(buffer, 0, 0);
Console.WriteLine(BitConverter.ToString(md5.Hash));
Console.WriteLine(BitConverter.ToString(sha1.Hash));
}
}
}
:)あなたはこのように、TransformBlock
とTransformFinalBlock
を使用することができます。私はあなたの前のコメントに基づいて、これがあなたが使いたいと思う例だと思っています。
奇妙なケースで私のファイルが複数のgbになる可能性があるので、ストリーミング形式で読む必要があります。この例は、私がウィキペディアで同じハッシュの言葉を持っているかどうかを確認することだけでした。 ストリーミングの部分は難しいですが、ComputeHashは現在のハッシュ値を伝えることができないようです。 –
@acidzombie:私の編集を参照してください - 私はあなたが与えた2番目の例がほしいと思います。 –
パーフェクト、完璧。それは素晴らしい作品、ありがとう:D –