【发布时间】:2019-03-01 10:23:21
【问题描述】:
我刚刚尝试在 C# 中创建一个 MD5 哈希程序。我的朋友给了我一个示例代码,但是当我尝试使用“123456”运行测试时,而不是返回正确的哈希结果
e10adc3949ba59abbe56e057f20f883e
返回结果
ce0bfd15059b68d67688884d7a3d3e8c
我试图阅读主要代码,但仍然无法得到任何东西!
string value = textBox1.Text;
byte[] valueBytes = new byte[value.Length * 2];
Encoder encoder = Encoding.Unicode.GetEncoder();
encoder.GetBytes(value.ToCharArray(), 0, value.Length, valueBytes, 0, true);
MD5 md5 = new MD5CryptoServiceProvider();
byte[] hashBytes = md5.ComputeHash(valueBytes);
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
{
stringBuilder.Append(hashBytes[i].ToString("x2"));
}
textBox2.Text = stringBuilder.ToString();
【问题讨论】:
-
C# 的 MD5 没有什么奇怪的。散列算法返回字节,而不是字符串。如何将字节数组格式化为字符串取决于您。
-
Unicode 有些字符是两个字节,有些是一个字节。您假设所有字符都是两个字节。
-
@jdweng .NET 字符串是 UTF16 并且字符总是占用 2 个字节。一些代码点可能需要两个字符来表示。
-
@ABCD 什么原创?什么是原始字节?散列适用于 bytes 而不是字符串。您使用 UTF16 编码将字符串转换为字节。如果你使用不同的,例如 ANSI,你会得到不同的字节。
-
“正确的哈希结果”:正如所说,哈希需要字节。关于“正确”是什么的缺失规范是使用“正确”字符编码,它将文本转换为字节。说正确结果是什么的人没有传达这一点。问。