【发布时间】:2013-06-16 14:19:09
【问题描述】:
问题说明了一切。这段代码
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(stream) 的正确方法是什么。对我来说,它总是(我的意思是总是,即使我重新启动程序,这意味着它不仅仅是对引用进行散列)返回相同的散列,而不管流中的数据如何。
【问题讨论】:
-
Stream实例可能位于流的末尾。ComputeHash返回从当前位置到流末尾的字节的哈希值。因此,如果当前位置 是 流的末尾,它将为空输入散列。确保Stream实例位于流的开头。请注意,访问StreamReader的BaseStream是一种不好的做法。 -
这就是问题所在!我希望您将其发布为答案,而不是评论,以便我可以选择您的答案。