【发布时间】:2021-06-21 10:02:39
【问题描述】:
作为个人练习,我一直在尝试在我正在编写的一个小程序中生成 SHA256 哈希值。我的计算机上有一个已加载到程序中的任意位图文件。某处有问题,我无法识别。我的程序返回的哈希是5EFFCC89AEA1922485CFA721194320D8895A4F31AC4AA5134AC2104C528033BA,但是当我在完全相同的文件上运行7-Zip 的SHA256 工具时,它返回D78859AD5651EB23A771C4763D03E65D64550C0660F7E182668586398CF02BF9。这是我的代码:
var image = new Bitmap(@"C:\Users\1\image.bmp");
var stream = new MemoryStream();
image.Save(stream, ImageFormat.Bmp);
var hashedBytes = new SHA256Managed().ComputeHash(stream);
var hash = string.Concat(hashedBytes.Select(x => x.ToString("X2")));
唯一看起来可能导致问题的代码是将图像转换为MemoryStream 对象。但如果我理解正确的话,这实际上只是一个字节数组,所以它似乎不应该改变任何数据。
我的代码有什么问题?
【问题讨论】:
-
如果您要计算文件的哈希值,为什么不使用
FileStream而不是先将其具体化为位图,然后再使其成为流?据我所知,这不能保证是幂等操作(即使散列计算在其他方面是完美的)。 -
您是否多次运行相同的结果?
-
我认为您应该将流重置为其起始位置。为了获得可比较的结果,请从未解释的文件中获取哈希,而不是从位图中获取。
-
@JeroenMostert 很抱歉造成混乱。你提出了一个很好的观点,我很感激你的意见。然而,这个程序会生成位图图像,我将计算它们的哈希值。但是在试图找出散列差异问题时,我使用磁盘上的一个文件进行测试,这样我就可以最大限度地减少程序中的可变性。