使用Microsoft SHA256,所有哈希值都相同

时间:2013-08-06 18:00:01

标签: 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 = new System.IO.StreamWriter(myStream))
            {
                sw.Write(value);
                hash = sha256.ComputeHash(myStream);
            }
        }

        return hash;
    }

3 个答案:

答案 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;

雅各