【问题标题】:How to use the MessageDigest class in java?如何在 java 中使用 MessageDigest 类?
【发布时间】:2018-03-03 21:41:32
【问题描述】:

在检查了这个问题 (How can I generate an MD5 hash?) 并阅读了 MessageDigest 文档后,我尝试散列一个简单的字符串。但是由于某种原因,我传递给该方法的每个字符串都返回相同的值。下面是我写的代码。

    byte[] bytesOfMessage = "helloworld".getBytes("UTF-8");
    MessageDigest md = MessageDigest.getInstance("MD5");
    byte[] thedigest = md.digest(bytesOfMessage);
    System.out.println(thedigest);

还有没有限制我从哈希中得到的字符数?

【问题讨论】:

  • 什么方法?你能分享重现问题所需的所有代码吗?
  • 使用System.out.println(Arrays.toString(thedigest))。您的代码实际上并没有打印数组的内容。
  • @JornVernee 当我将代码更改为该代码时,输​​出是一个包含整数的数组。
  • 这就是数组的地址,如上所述。您需要将字节数组转换为字符串,如下所示: System.out.println(new String(thedigest));
  • @TobiasWeimer+OP:摘要实际上是随机位,因此new String(byte[]) 使用与平台相关的默认字符集通常会丢弃或破坏大部分数据。最好使用 hex 或 base64,或者至少指定 ISO-8859-1(又名 Latin-1),以便可靠地保留所有字节值。

标签: java hash md5 hashcode


【解决方案1】:

System.out.println(thedigest); 调用数组的toString() 方法。

Java 数组类型不会覆盖Object#toString() 的默认实现:

// from Object.java
public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

这就是你看到字符串[B@5b1d2887的原因

如果要打印数组,请使用java实用程序类java.util.Arrays

System.out.println(Arrays.toString(myArray));

但在你的情况下,你应该从你的 MD5 摘要字节数组中创建一个人类可读的字符串。使用这个简单的方法:

public static String digestToReadableString(byte[] digest){
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < digest.length; i++) {
        String s = Integer.toHexString(digest[i]);
        while (s.length() < 2) {
            s = "0" + s;
        }
        s = s.substring(s.length() - 2); // we need the last 2 chars
        sb.append(s);
    }
    return sb.toString();
}

或者这个:https://stackoverflow.com/a/304275/1614378

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 2021-05-07
    • 1970-01-01
    • 2022-11-06
    • 2013-01-06
    • 1970-01-01
    相关资源
    最近更新 更多