7

jpgファイルからハッシュを作成するac#ルーチンを書いています。バイト配列を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");

それは「ハッシュされた同じ」を生成します。

私が行方不明になっているここで何が起こっているのですか?

4

1 に答える 1

17

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

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

呼び出した後Save

GetBufferもう1つの注意:このように使用しないでください。ToArrayストリームの長さと同じサイズのバイト配列を提供するUseGetBufferは、(通常は)誤って使用したくないパディングを含むrawバッファーを返します。もちろん、関連する部分のみを使用するようにすると、使用できGetBufferます。これにより、データの新しいコピーが作成されなくなります。

于 2009-11-11T14:07:16.637 に答える