C# 使用Microsoft SHA256时,所有哈希值都相同
使用下面的代码,无论输入是什么,我总是得到相同的哈希值。你知道为什么吗C# 使用Microsoft SHA256时,所有哈希值都相同,c#,hash,sha,sha256,C#,Hash,Sha,Sha256,使用下面的代码,无论输入是什么,我总是得到相同的哈希值。你知道为什么吗 private static SHA256 sha256; internal static byte[] HashForCDCR(this string value) { byte[] hash; using (var myStream = new System.IO.MemoryStream()) { using (var sw
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;
}
你可能需要冲洗你的水流。为了获得最佳性能,StreamWriter不会立即写入流。它等待内部缓冲区填满。刷新写入程序会立即刷新内部缓冲区的内容以在流中加下划线
sw.Write(value);
sw.Flush();
myStream.Position = 0;
hash = sha256.ComputeHash(myStream);
你可能需要冲洗你的水流。为了获得最佳性能,StreamWriter不会立即写入流。它等待内部缓冲区填满。刷新写入程序会立即刷新内部缓冲区的内容以在流中加下划线
sw.Write(value);
sw.Flush();
myStream.Position = 0;
hash = sha256.ComputeHash(myStream);
您正在计算流的空部分的散列(紧跟在您用
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);
}
}
您正在计算流的空部分的散列(紧跟在您用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);
}
}
我可能会使用Alexei Levenkov称之为“廉价修复”的解决方案。然而,我确实遇到了另一种方法,我将向未来的读者发布:
var encoding = new System.Text.UTF8Encoding();
var bytes = encoding.GetBytes(value);
var hash = sha256.ComputeHash(bytes);
return hash;
Jacob我可能会使用Alexei Levenkov称之为“廉价修复”的解决方案。然而,我确实遇到了另一种方法,我将向未来的读者发布:
var encoding = new System.Text.UTF8Encoding();
var bytes = encoding.GetBytes(value);
var hash = sha256.ComputeHash(bytes);
return hash;
Jacob您需要按照下面的建议设置myStream.Position=0。我编辑了我的答案以反映这一点。您需要按照下面的建议将myStream.Position设置为0。我已经编辑了我的答案以反映这一点。这会在ComputeHash行上出现错误“无法访问封闭流”。另外,第三个using语句需要在末尾添加另一个“)”。@OPOSJacob本应是新流-示例已修复。这会在ComputeHash行上出现错误“无法访问封闭流”。另外,第三个using语句需要在末尾添加另一个“)”。@OPOSJacob应该是新的stream-sample-fixed。