java中计算string的md5值需先用utf-8编码转字节数组,再通过messagedigest.getinstance("md5")计算摘要,最后将16字节摘要按%02x格式转为32位小写十六进制字符串。

Java 中用 MessageDigest 计算 String 的 MD5 值,核心是把字符串转成字节数组(指定 UTF-8 编码),再用 MessageDigest.getInstance("MD5") 摘要计算,最后将字节数组转为十六进制字符串。
确保使用 UTF-8 编码转换字符串
MD5 是对字节流运算的,不是直接对字符串。不同编码可能导致结果不同,必须显式指定 UTF-8:
- 避免用
string.getBytes()(依赖平台默认编码,不可靠) - 始终用
string.getBytes(StandardCharsets.UTF_8)
调用 MessageDigest 计算摘要
获取实例、重置状态、传入字节、生成摘要:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
MessageDigest.getInstance("MD5")获取 MD5 实例(不区分大小写,但推荐大写) - 可重复使用同一实例:调用
digest.reset()清空上次状态 - 用
digest.digest(bytes)返回摘要字节数组(长度固定为 16 字节)
将摘要字节数组转为 32 位十六进制字符串
每个字节需转成两位十六进制字符(如 0x0a → "0a"),注意补零:
- 不能直接用
String.format("%x", b),因为负字节会变成长整型(如-1 → "ffffffff") - 正确做法:用
String.format("%02x", b & 0xFF),先按位与 0xFF 转为无符号值 - 也可用
BigInteger(1, bytes).toString(16),但要注意前面补零至 32 位
完整示例代码(含异常处理)
封装成工具方法,兼顾可读性和健壮性:
public static String md5(String input) {
if (input == null) return "";
try {
MessageDigest digest = MessageDigest.getInstance("MD5");
byte[] hash = digest.digest(input.getBytes(StandardCharsets.UTF_8));
StringBuilder hex = new StringBuilder();
for (byte b : hash) {
hex.append(String.format("%02x", b & 0xFF));
}
return hex.toString();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("MD5 algorithm not available", e);
}
}
调用:md5("hello") 返回 "5d41402abc4b2a76b9719d911017c592"。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










