使用以下代码,无论输入如何,我总是得到相同的哈希值。任何想法为什么会这样?
private static SHA256 sha256;
internal static byte[] HashForCDCR(this string value)
{
byte[] hash;
using (var myStream = new System.IO.MemoryStream())
{
using (var sw = new System.IO.StreamWriter(myStream))
{
sw.Write(value);
hash = sha256.ComputeHash(myStream);
}
}
return hash;
}
答案 0 :(得分:3)
您正在计算流的空白部分(您使用sw.Write
编写的内容之后的哈希),因此它总是相同的。
廉价修复:sw.Flush();myStream.Position = 0;
。更好的解决方法是完成写入并基于原始流创建新的只读加密流:
using (var myStream = new System.IO.MemoryStream())
{
using (var sw = new System.IO.StreamWriter(myStream))
{
sw.Write(value);
}
using (var readonlyStream = new MemoryStream(myStream.ToArray(), writable:false)
{
hash = sha256.ComputeHash(readonlyStream);
}
}
答案 1 :(得分:1)
您可能需要刷新流。为获得最佳性能,StreamWriter不会立即写入流。它等待内部缓冲区填充。刷新编写器会立即刷新内部缓冲区的内容以强调流。
sw.Write(value);
sw.Flush();
myStream.Position = 0;
hash = sha256.ComputeHash(myStream);
答案 2 :(得分:0)
我可能会使用Alexei Levenkov称之为“廉价修复”的解决方案。但是,我确实遇到了另一种使其工作的方式,我将发布给未来的读者:
var encoding = new System.Text.UTF8Encoding();
var bytes = encoding.GetBytes(value);
var hash = sha256.ComputeHash(bytes);
return hash;
雅各