私はMemoryStreamをを使用するときに、なぜこれらの2つのファイルが同じ値にハッシュしますか?

StackOverflow https://stackoverflow.com/questions/1715362

  •  19-09-2019
  •  | 
  •  

質問

私がjpgファイルからハッシュを作成し、C#のルーチンを書いています。私はその後、私のSHA512オブジェクトにバイト配列を渡した場合、私は2つのファイルが常に同じ値にハッシュストリーミングメモリに渡す場合、私は、しかし、予想される動作を取得します。

例1:

        SHA512 mySHA512 = SHA512.Create();

        Image img1 = Image.FromFile(@"d:\img1.jpg");
        Image img2 = Image.FromFile(@"d:\img2.jpg");
        MemoryStream ms1 = new MemoryStream();
        MemoryStream ms2 = new MemoryStream();

        img1.Save(ms1, ImageFormat.Jpeg);
        byte[] buf1 = ms1.GetBuffer();
        byte[] hash1 = mySHA512.ComputeHash(buf1);

        img2.Save(ms2, ImageFormat.Jpeg);
        byte[] buf2 = ms2.GetBuffer();
        byte[] hash2 = mySHA512.ComputeHash(buf2);

        if (Convert.ToBase64String(hash1) == Convert.ToBase64String(hash2))
            MessageBox.Show("Hashed the same");
        else
            MessageBox.Show("Different hashes");

「異なるハッシュ」を生成すること。しかし、ComputeHashメソッドのオーバーロードの1は、ストリームオブジェクトを受け取り、私はむしろそれを使用すると思います。私が行うときます:

        SHA512 mySHA512 = SHA512.Create();

        Image img1 = Image.FromFile(@"d:\img1.jpg");
        Image img2 = Image.FromFile(@"d:\img2.jpg");
        MemoryStream ms1 = new MemoryStream();
        MemoryStream ms2 = new MemoryStream();

        img1.Save(ms1, ImageFormat.Jpeg);
        byte[] hash1 = mySHA512.ComputeHash(ms1);

        img2.Save(ms2, ImageFormat.Jpeg);
        byte[] hash2 = mySHA512.ComputeHash(ms2);

        if (Convert.ToBase64String(hash1) == Convert.ToBase64String(hash2))
            MessageBox.Show("Hashed the same");
        else
            MessageBox.Show("Different hashes");

"同じハッシュ化された" 生成する。

私が欠けていることを、ここで何が起こっている?

役に立ちましたか?

解決

あなたはMemoryStreamsを巻き戻していないので、ハッシュはバイトの空のシーケンスから計算されます。使用

ms1.Position = 0;
ms2.Position = 0;

Saveを呼び出した後。

一つの更なる注意:この方法でGetBufferを使用しないでください。 ToArrayは(通常は)あなたが誤って使用したくないいくつかのパディングを、持っています生のバッファを返す - ストリームの長さとしてバイト配列に、あなたに同じ大きさを与えるGetBufferを使用してください。あなたは、あなただけのコースのそれの関連部分を、使用することを確認した場合は、GetBufferを使用することができます - 。これは、データの新しいコピーを作成する回避

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top