我正在编写一个从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");
这会产生“相同的哈希值”。
我错过了什么?
mySHA512.ComputeHash.ComputeHash(ms1.GetBuffer(),0,(int)ms1.Length)
。避免不必要的复制。 - CodesInChaosMemoryStream.GetBytes()
方法比调用GetBuffer()
更正确。前者将返回被限制在流实际内容中的数据,而后者则返回完整的缓冲区,包括末尾未使用的填充。 - Peter Duniho