C#中的散列字符串不可读

时间:2014-06-18 14:07:27

标签: java c# hash hashcode

我正在尝试在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 TextBox中的输出看起来像是:“՘” ?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#中看起来很奇怪?

1 个答案:

答案 0 :(得分:3)

你的C#结果看起来很奇怪"因为您已将哈希的随机字节转换为UTF-8字符串。这不会导致任何漂亮的外观,因为许多字节值将映射到不可打印的字符。

您可能希望将哈希转换为十六进制。为此,请使用DatatypeConverter类:

return DatatypeConverter.printHexBinary(input);

我不确定C#是否相同 - 但请查看Google。


对于记录,当前C#代码的Java等价物将是:

return new String(input, "UTF-8");

目前您正在调用.toString(),对于Java字节数组,它会调用Object.toString()方法。这将打印对象的类型和哈希码,但不打印内容。