为什么哈希字符串的示例通常使用 Encoding.UTF8?

sha*_*oth 3 .net c# unicode hash encoding

引用的代码来自这个答案,但类似的代码几乎无处不在。假设我们需要使用System.Security.Cryptography.HashAlgorithm.ComputeHash()接受byte[]. 典型的代码是这样的:

public static byte[] GetHash(string inputString)
{
    HashAlgorithm algorithm = MD5.Create();  // SHA1.Create()
    return algorithm.ComputeHash(Encoding.UTF8.GetBytes(inputString));
}
Run Code Online (Sandbox Code Playgroud)

字符串在内部存储为 Unicode。

为什么Encoding.UTF8用 代替Encoding.Unicode

bob*_*nce 5

\n

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

\n
\n\n

因为这是大多数其他应用程序框架选择用于哈希的编码。在 .NET 世界之外,UTF-16LE 编码(这就是错误命名的 \xe2\x80\x9cUnicode\xe2\x80\x9d 编码)不一定是字符串存储的自然选择。如果您使用 UTF-8 以外的其他格式,您将无法与其他系统生成的哈希值进行互操作。

\n\n

至关重要的是,UTF-8 与 ASCII 兼容:对于纯 ASCII 输入数据,这将生成与所有处理不了解编码的字节字符串的软件相匹配的哈希值。其中包括许多 PHP Web 应用程序、调用 na\xc3\xafve 的 Java 应用程序String.getBytes等。

\n\n

因此,使用 UTF-8 意味着您可以与所有使用 UTF-8 的现代事物实现完全互操作,并与几乎所有其他事物实现部分互操作。使用 UTF-16 会得到与其他人的哈希值不匹配的哈希值。

\n\n

如果您确定只会在内部使用哈希值,您仍然可以这样做,但它并没有真正为您赢得任何东西。不编码为 UTF-8 所节省的任何费用都可能因必须对较长的输入序列进行哈希处理而被抵消,因为对于最有可能出现的 ASCII 字符,UTF-8 是比 UTF-16 更有效的表示形式。

\n