将哈希值转换为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或有人删除了他的非常回答。 这是一个很好的举动。