Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Microsoft SHA256时,所有哈希值都相同_C#_Hash_Sha_Sha256 - Fatal编程技术网

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。