将哈希值转换为十六进制字符串

时间:2009-09-17 01:38:14

标签: c# string hash hex

在此页面上:

http://www.shutterfly.com/documentation/OflyCallSignature.sfly

它说,一旦你生成一个哈希,那么:

将哈希转换为十六进制字符串

csharp中是否有代码执行此操作?

2 个答案:

答案 0 :(得分:13)

要获取哈希值,请使用System.Security.Cryptography.SHA1Managed class

编辑:像这样:

byte[] hashBytes = new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(str));

要将哈希值转换为十六进制字符串,请使用以下代码:

BitConverter.ToString(hashBytes).Replace("-", "");

如果您想要更快的实施,请使用以下功能:

private static char ToHexDigit(int i) {
    if (i < 10) 
        return (char)(i + '0');
    return (char)(i - 10 + 'A');
}
public static string ToHexString(byte[] bytes) {
    var chars = new char[bytes.Length * 2 + 2];

    chars[0] = '0';
    chars[1] = 'x';

    for (int i = 0; i < bytes.Length; i++) {
        chars[2 * i + 2] = ToHexDigit(bytes[i] / 16);
        chars[2 * i + 3] = ToHexDigit(bytes[i] % 16);
    }

    return new string(chars);
}

答案 1 :(得分:1)

我还没有发表评论,没有足够的代表,但是Lior正在将Java与C#混合在一个非常错误的答案中。

C#中的

字节是无符号字节,与C#中所有其他整数类型完全相反,默认情况下会对其进行签名。

0xFF部分完全没有意义,因为即使字节被签名,例如0xFE也是-2。例如,使用按位和0xFE和0xFF不会阻止负数0xFE成为结果。 0x7F会。

关于最佳答案,我非常确定这些微优化可能有所帮助,尽管它们可能不会产生任何真正差异的微优化,因为JIT编译器可能只是做其他事情因为计算机太快了。

    chars[2 * i + 2] = ToHexDigit(bytes[i] / 16);
    chars[2 * i + 3] = ToHexDigit(bytes[i] % 16);

使用bitshift和bitwise ops代替分频器和模数的小改动。

    chars[2 * i + 2] = ToHexDigit((bytes[i] >> 4) & 0xF);
    chars[2 * i + 3] = ToHexDigit(bytes[i] & 0xF);

这是另一个&#34;优化&#34;,虽然我认为它更具可读性。也许这是因为我很清楚大部分的ASCII表格。

    private static char ToHexDigit(int i)
    {
        return (char)(i + (i < 10 ? 48 : 55));
    }

如果您正在尝试实现小写十六进制(没有ToLower),只需将87与87交换。这非常简单。

更新:看起来像Lior或有人删除了他的答案。这是一个很好的举动。