MD5(Message Digest Algorithm 5)雖不再適合密碼學安全場景,但在文件完整性校驗、緩存 Key 生成、非敏感數據指紋等領域仍廣泛使用。本文詳解 JDK 原生與 Apache Commons Codec 兩種實現方式,附生產級封裝建議。
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Md5Native {
private static final char[] HEX_DIGITS =
{'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
public static String md5Hex(String input) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] digest = md.digest(input.getBytes(StandardCharsets.UTF_8));
return bytesToHex(digest);
} catch (NoSuchAlgorithmException e) {
throw new IllegalStateException("MD5 算法不可用", e);
}
}
private static String bytesToHex(byte[] bytes) {
char[] chars = new char[bytes.length * 2];
for (int i = 0; i < bytes.length; i++) {
int v = bytes[i] & 0xFF;
chars[i * 2] = HEX_DIGITS[v >>> 4];
chars[i * 2 + 1] = HEX_DIGITS[v & 0x0F];
}
return new String(chars);
}
}
優點:零第三方依賴、JDK 內置。
缺點:樣板代碼多、需手寫十六進制轉換、易出錯。
Maven 依賴:
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.16.0</version>
</dependency>
調用代碼:
import org.apache.commons.codec.digest.DigestUtils;
String md5 = DigestUtils.md5Hex("baidu.com"); // 一行搞定
// 輸出:a3b1c2d4e5f6... (32位十六進制小寫)
優點:API 極簡、內部優化、支持流式計算大文件。
缺點:引入額外 JAR(約 300KB)。
// Commons Codec 支持 InputStream 直接計算
try (FileInputStream fis = new FileInputStream("large-file.zip")) {
String fileMd5 = DigestUtils.md5Hex(fis);
}
// 原生寫法需手動分塊讀取更新
MessageDigest md = MessageDigest.getInstance("MD5");
try (FileInputStream fis = new FileInputStream("large-file.zip")) {
byte[] buffer = new byte[8192];
int len;
while ((len = fis.read(buffer)) != -1) {
md.update(buffer, 0, len);
}
}
String fileMd5 = bytesToHex(md.digest());
PasswordEncoder)。public final class Md5Utils {
private Md5Utils() {}
/** 字符串 MD5(UTF-8) */
public static String md5Hex(String input) {
return DigestUtils.md5Hex(input.getBytes(StandardCharsets.UTF_8));
}
/** 文件 MD5(流式,大文件安全) */
public static String md5Hex(File file) throws IOException {
try (FileInputStream fis = new FileInputStream(file)) {
return DigestUtils.md5Hex(fis);
}
}
/** 輸入流 MD5(調用者負責關閉流) */
public static String md5Hex(InputStream is) {
return DigestUtils.md5Hex(is);
}
}
新項目首選 Apache Commons Codec,代碼簡潔、維護性強;受限環境無法引入依賴時,用 JDK 原生實現並封裝工具類。切記:MD5 非安全算法,請嚴格限定使用場景。