这个问题说明了一切。这段代码
string hash = "";
using (var md5 = System.Security.Cryptography.MD5.Create())
{
hash = Convert.ToBase64String(md5.ComputeHash(streamReader.BaseStream));
}
将始终返回相同的哈希值。
如果我将所有数据从BaseStream传递到MemoryStream,它每次都会提供一个唯一的哈希值。运行
也是如此string hash = "";
using (var md5 = System.Security.Cryptography.MD5.Create())
{
hash = Convert.ToBase64String(md5.ComputeHash(
Encoding.ASCII.GetBytes(streamReader.ReadToEnd())));
}
第二个实际上更快,但我听说这是不好的做法。
我的问题是,使用ComputeHash(流)的正确方法是什么。对我而言,它总是(我的意思是,即使我重新启动程序,意味着它不仅仅是散列引用)也会返回相同的散列,无论流中的数据如何。
答案 0 :(得分:12)
Stream
实例可能位于流的末尾。 ComputeHash
返回从当前位置到流末尾的字节的哈希值。因此,如果当前位置是流的结尾,则它将为空输入的哈希。确保Stream
实例位于流的开头。
答案 1 :(得分:3)
我在 ComputeHash
之前设置 stream.Position = 0 解决了这个问题