将哈希值转换为hex字符串

在本页面:

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

它说,一旦你生成一个哈希你然后:

将哈希值转换为hex字符串

csharp中有代码可以做到这一点吗?

要获取哈希,请使用System.Security.Cryptography.SHA1Managed类 。

编辑 :像这样:

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

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

 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); } 

我还不能发表评论,没有足够的代表,但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而不是divider和modulo。

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

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

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

如果你想要实现小写hex(没有ToLower),只需用87交换55.这非常简单。

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