Java中字节数组的哈希值

时间:2016-12-14 20:15:32

标签: java c# hash

我将一些C#转换为Java。 C#是:

// Return a SHA256 hash of a string, formatted in hex
private static string HashPassword(string password)
{
    SHA256Managed hash = new SHA256Managed();
    byte[] utf8 = UTF8Encoding.UTF8.GetBytes(password);
    return BytesToHex(hash.ComputeHash(utf8));
}

在Java中,我将SHA256Managed替换为MessageDigest

private static String HashPassword(String password)
{
    MessageDigest hash = MessageDigest.getInstance("SHA-256");
    byte[] utf8 = hash.digest(password.getBytes(StandardCharsets.UTF_8));

    return BytesToHex(hash.ComputeHash(utf8)); // ComputeHash?
}

但是MessageDigest没有ComputeHash(),也没有看到它的等价物。 MessageDigest是否在这里使用正确的类?如果是这样,我该怎么办ComputeHash()。如果不是我使用哪个班级?

请注意BytesToHex将字节数组转换为十六进制字符串。

2 个答案:

答案 0 :(得分:4)

MessageDigest是有状态的。您会逐步将数据传递给它,并在您完成后调用digest()来计算所有数据的哈希值。

您调用的hash.digest(byte[])方法基本上是hash.update(byte[])然后hash.digest()的简写。

调用digest()也会将MessageDigest实例重置为其初始状态。

答案 1 :(得分:3)

在Java中,变量utf8包含计算的哈希值,与C#不同。要匹配C#看起来的方式,它应该是:

byte[] utf8 = password.getBytes(StandardCharsets.UTF_8);

return bytesToHex(hash.digest(utf8));

附注:请遵守lowerCamelCased方法名称的Java编码标准。