【问题标题】:C# BaseStream returning same MD5 hash regardless of what is in the streamC# BaseStream 返回相同的 MD5 哈希,无论流中有什么
【发布时间】: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 实例位于流的开头。请注意,访问StreamReaderBaseStream 是一种不好的做法。
  • 这就是问题所在!我希望您将其发布为答案,而不是评论,以便我可以选择您的答案。

标签: c# .net hash stream md5


【解决方案1】:

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

【讨论】:

  • 非常感谢 - 大大减少了我在最终面对手掌之前花费的时间。
  • 这太可怕了,我犯了这个错误。
【解决方案2】:

我通过在 ComputeHash

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

【讨论】:

    猜你喜欢
    • 2018-03-23
    • 1970-01-01
    • 2015-04-13
    • 2013-03-30
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    相关资源
    最近更新 更多