我怎样才能在C#中使用SHA512字符串?

Jam*_*mes 34 c# hash

我正在尝试编写一个函数来获取字符串和sha512就像这样?

public string SHA512(string input)
{
     string hash;

     ~magic~

     return hash;
}
Run Code Online (Sandbox Code Playgroud)

魔术应该是什么?

Car*_*tte 62

您的代码是正确的,但您应该处置SHA512Managed实例:

using (SHA512 shaM = new SHA512Managed())
{
   hash = shaM.ComputeHash(data);
}
Run Code Online (Sandbox Code Playgroud)

512位是64字节.

要将字符串转换为字节数组,您需要指定编码.如果要创建哈希码,UTF8是可以的:

var data = Encoding.UTF8.GetBytes("text");    
using (...
Run Code Online (Sandbox Code Playgroud)

  • 不以任何方式使用处理的示例数量令人震惊.用"使用"来展示惯用方式的荣誉. (12认同)
  • 不要混淆垃圾收集和释放/处置未使用的非托管对象.使用"using"确保在using块结束时调用Dispose.这将释放非托管资源 - 否则它们将在GC清理对象时释放(并在内部调用终结器).SHA512Managed类是一次性的,所以我更喜欢使用.有关Dispose模式的更多信息,请查看https://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.110).aspx (4认同)
  • 而不是`var data = Encoding.UTF8.GetByteCount(foo)`,使用`var data = Encoding.UTF8.GetBytes(foo)`. (3认同)

Naz*_*zar 17

这来自我的一个项目:

public static string SHA512(string input)
{
    var bytes = System.Text.Encoding.UTF8.GetBytes(input);
    using (var hash = System.Security.Cryptography.SHA512.Create())
    {
        var hashedInputBytes = hash.ComputeHash(bytes);

        // Convert to text
        // StringBuilder Capacity is 128, because 512 bits / 8 bits in byte * 2 symbols for byte 
        var hashedInputStringBuilder = new System.Text.StringBuilder(128);
        foreach (var b in hashedInputBytes)
            hashedInputStringBuilder.Append(b.ToString("X2"));
        return hashedInputStringBuilder.ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意:

  1. SHA512对象被处置('使用'部分),因此我们没有任何资源泄漏.
  2. StringBuilder用于高效的十六进制字符串构建.

  • StringBuilder代码可以替换为单行'var hash = BitConverter.ToString(hashedInputBytes).Replace(" - ","");' https://msdn.microsoft.com/en-us/library/system.bitconverter.tostring(v=vs.110).aspx (3认同)

lui*_*bal 8

512/8 = 64,所以64确实是正确的大小.也许你想在SHA512算法之后将它转换为十六进制.

另请参阅:如何将字节数组转换为十六进制字符串,反之亦然?