引用的代码来自this answer,但类似的代码几乎无处不在。假设我们需要使用接受System.Security.Cryptography.HashAlgorithm.ComputeHash()
的{{1}}方法实现来散列C#字符串内容。典型代码如下:
byte[]
字符串在内部存储为Unicode。
为什么使用public static byte[] GetHash(string inputString)
{
HashAlgorithm algorithm = MD5.Create(); // SHA1.Create()
return algorithm.ComputeHash(Encoding.UTF8.GetBytes(inputString));
}
代替Encoding.UTF8
?
答案 0 :(得分:3)
为什么使用Encoding.UTF8而不是Encoding.Unicode? p>
因为这是大多数其他应用程序框架已经选择用于哈希的编码。在.NET世界之外,UTF-16LE编码(实际上是错误的“Unicode”编码)不一定是字符串存储的自然选择。如果您使用UTF-8以外的其他内容,则无法与其他系统生成的哈希值进行互操作。
至关重要的是,UTF-8与ASCII兼容:对于仅使用ASCII的输入数据,这将生成与所有使用编码无效字节字符串的软件匹配的哈希值。这包括许多PHP webapps,调用naïveString.getBytes
的Java应用程序等等。
因此,使用UTF-8意味着您可以使用UTF-8和部分互操作的所有内容完全互操作。使用UTF-16会为你提供与其他人不匹配的哈希值。
如果你确定你只会在内部使用哈希,你仍然可以这样做,但它并没有真正赢得任何东西。由于不需要对较长的输入序列进行散列,因此不使用编码为UTF-8所节省的任何费用可能会被取消,因为对于最可能出现的ASCII字符,UTF-8比UTF-16更有效。