C# BaseStream返回的MD5哈希值无论流中包含什么始终相同

7
问题已经被表述得很清楚了。这段代码...
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)的正确方式是什么。 对于我来说,它总是返回相同的哈希值(即使我重新启动程序,这意味着它不仅仅是哈希引用),而与流中的数据无关。

4
可能性是Stream实例已经定位在流的末尾。ComputeHash返回从当前位置到流末尾的字节的哈希值。所以如果当前位置就是流的末尾,它将返回空输入的哈希值。确保Stream实例定位在流的开头。请注意,访问StreamReaderBaseStream是不好的做法。 - dtb
这就是问题所在!我希望你把它作为答案发布,而不是评论,这样我就可以选择你的了。 - JBarber
2个回答

16

Stream 实例可能位于流的末尾。ComputeHash 返回从当前位置到流末尾的字节的哈希值。因此,如果当前位置是流的末尾,则将返回空输入的哈希值。请确保Stream实例位于流的开头。


1
非常感谢你显著地减少了我在最终面对失败之前所花费的时间。 - MattE_WI
这很可怕,我也犯了这个错误。 - EKS

3

ComputeHash之前设置stream.Position = 0,我解决了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接