You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java实现MD5生成时相同字符串每次结果不同,求问题排查

问题根因

你遇到的MD5值不稳定问题和每次传入新String数组完全无关,主要是两个问题导致的:

  • 调用getBytes()时未指定固定字符集:Java的String.getBytes()默认使用当前运行环境的系统默认字符集,不同环境、不同配置下默认字符集可能存在差异,导致相同字符串转成的字节数组内容不一致,最终生成的MD5值自然不同。
  • 代码存在拼写错误:StringBuilder的类名被误写为StringBuidler,少了字母l,这会导致代码编译不通过,如果你实际运行的是可执行版本,大概率是贴代码时的手误,优先排查字符集问题。

修正方案

修改getBytes()调用,明确指定固定字符集(比如通用的UTF-8)即可保证相同字符串生成的字节数组完全一致,修正后的代码如下:

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public static byte[] getHash(String[] constants) throws NoSuchAlgorithmException
{
    // 每次调用新建MessageDigest实例,不存在线程安全问题
    MessageDigest md = MessageDigest.getInstance("MD5");
    StringBuilder toBeHashed = new StringBuilder();
    for(String c: constants)
    {
        toBeHashed.append(c);
    }
    // 明确指定UTF-8字符集,避免默认字符集差异影响结果
    return md.digest(toBeHashed.toString().getBytes(StandardCharsets.UTF_8));
}

如果你使用的是Java 7以下版本,不支持StandardCharsets,可以替换为getBytes("UTF-8"),额外处理UnsupportedEncodingException即可。
驱动代码不需要修改,传入的字符串内容固定的情况下,生成的MD5值会完全一致。


内容的提问来源于stack exchange,提问作者Searching For Solutions

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 00:09:00