【发布时间】:2023-03-22 18:16:01
【问题描述】:
我正在尝试在 C# 和 Java 中散列相同的字符串。
C#哈希方法:
public static string hashValue (string value)
{
byte[] input = null;
HashAlgorithm digest = HashAlgorithm.Create("SHA-512");
input = digest.ComputeHash(Encoding.UTF8.GetBytes(value));
return System.Text.UTF8Encoding.UTF8.GetString(input);
}
WPF 文本框中的输出如下所示:""�?N[��"��2��D��j��t!z}7�H�p “J����GƼOp�EnBfH��X���”。
Java 中的相同函数返回结果:“[B@41e2db20”。
Java 哈希方法是这样的:
public static String hashValue(String value) {
byte[] input = null;
MessageDigest digest;
try {
digest = MessageDigest.getInstance("SHA-512");
try {
input = digest.digest(value.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} catch (NoSuchAlgorithmException e1) {
e1.printStackTrace();
}
return input.toString();
}
你能告诉我我做错了什么吗?为什么结果在 C# 中看起来那么奇怪?
【问题讨论】:
-
对我来说,Java 版本看起来不对。
SHA-512应该返回 512 位 => 64 字节 =>[B@41e2db20很短(请参阅 en.wikipedia.org/wiki/SHA-2#Examples_of_SHA-2_variants) -
您不应将哈希显示为 UTF8。它只是一个字节数组而不是字符串。有关示例,请参见 stackoverflow.com/a/5340599/706456。
-
不要把哈希值当作字符串——如果你想显示它,用十六进制编码
-
我现在明白问题所在了。非常感谢你让我大开眼界:)