为什么散列字符串的样本通常使用Encoding.UTF8?

时间:2014-04-02 09:16:35

标签: c# .net unicode encoding hash

引用的代码来自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

1 个答案:

答案 0 :(得分:3)

  

为什么使用Encoding.UTF8而不是Encoding.Unicode?

因为这是大多数其他应用程序框架已经选择用于哈希的编码。在.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更有效。