gpt4 book ai didi

c# - 为什么我使用 MemoryStream 时这两个文件的哈希值相同?

转载 作者:太空狗 更新时间:2023-10-29 19:57:50 25 4
gpt4 key购买 nike

我正在编写一个从 jpg 文件创建散列的 c# 例程。如果我将一个字节数组传递给我的 SHA512 对象,那么我会得到预期的行为,但是,如果我传递一个内存流,这两个文件总是散列为相同的值。

示例 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 方法的重载之一需要一个流对象,我宁愿使用它。当我这样做时:

        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;

在调用保存之后。

进一步注意:不要以这种方式使用 GetBuffer。使用 ToArray,它会给你一个字节数组,其大小与流的长度相同 - GetBuffer 返回原始缓冲区,它(通常)会有一些填充,你不会一不小心想用。如果您随后确保只使用它的相关部分,则可以使用 GetBuffer,当然 - 这可以避免创建数据的新副本。

关于c# - 为什么我使用 MemoryStream 时这两个文件的哈希值相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1715362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com