在C#中使用SHA1算法进行哈希处理

Mer*_*aya 66 c# hash byte sha1 hashcode

我希望byte[]使用使用SHA1Algorithm的哈希给定数组SHA1Managed.
byte[]散列将来自单元测试.
预期的散列是0d71ee4472658cd5874c5578410a9d8611fc9aef(区分大小写).

我怎样才能做到这一点?

public string Hash(byte [] temp)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

Mit*_*tch 139

对于那些想要散列的"标准"文本格式的人,可以使用以下内容:

static string Hash(string input)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        var hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(input));
        var sb = new StringBuilder(hash.Length * 2);

        foreach (byte b in hash)
        {
            // can be "x2" if you want lowercase
            sb.Append(b.ToString("X2"));
        }

        return sb.ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

这会产生类似哈希的0C2E99D0949684278C30B9369B82638E1CEAD415.

或者代码高尔夫版本:

static string Hash(string input)
{
    var hash = new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(input));
    return string.Concat(hash.Select(b => b.ToString("x2")));
}
Run Code Online (Sandbox Code Playgroud)

  • @Mitch如果它实现了IDisposable接口,那么参考源中发生的事情应该无关紧要.如果他们因为任何原因而改变它,以致.Dispose()调用变得很重要,那么以前工作的代码现在会导致问题.依靠查看框架的内部来确定您可以逃脱的是维护噩梦的途径.我强烈建议遵循文档并正确处理一次性物品,从长远来看,它将为您带来痛苦. (18认同)
  • @ijt,X2 告诉它每个字节使用两个十六进制数字。`x2` 表示小写,`X2` 表示大写 (3认同)

Joh*_*ogo 35

public string Hash(byte [] temp)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        var hash = sha1.ComputeHash(temp);
        return Convert.ToBase64String(hash);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

您还可以在将字节数组转换为字符串时指定编码,如下所示:

return System.Text.Encoding.UTF8.GetString(hash);
Run Code Online (Sandbox Code Playgroud)

要么

return System.Text.Encoding.Unicode.GetString(hash);
Run Code Online (Sandbox Code Playgroud)

  • 如果他们想要十六进制字符串,那么 Base64 可能是错误的选择。 (3认同)

sky*_*dev 13

这就是我的用途.对于那些想要优化的人,请查看/sf/answers/43706561/.

    public static string Hash(string stringToHash)
    {
        using (var sha1 = new SHA1Managed())
        {
            return BitConverter.ToString(sha1.ComputeHash(Encoding.UTF8.GetBytes(stringToHash)));
        }
    }
Run Code Online (Sandbox Code Playgroud)


Gra*_*mas 8

您可以使用以下方法"计算指定字节数组的值" ComputeHash:

var hash = sha1.ComputeHash(temp);
Run Code Online (Sandbox Code Playgroud)

如果要分析字符串表示形式的结果,则需要使用{0:X2}格式说明符格式化字节.


ali*_*ini 7

最快的方法是这样的:

    public static string GetHash(string input)
    {
        return string.Join("", (new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(input))).Select(x => x.ToString("X2")).ToArray());
    }
Run Code Online (Sandbox Code Playgroud)

对于小字符输出,用于x2替换X2

  • SHA1Managed实现IDisposable,因此您可能希望在完成处理后将其处置以释放资源。 (2认同)