package com.b510.note;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5 {
public static void main(String[] args) {
System.out.println(getMD5("123456")); // 輸出: e10adc3949ba59abbe56e057f20f883e
}
public static String getMD5(String input) {
if (input == null) return "null";
try {
String algorithm = System.getProperty("MD5.algorithm", "MD5");
MessageDigest md = MessageDigest.getInstance(algorithm);
byte[] buffer = input.getBytes();
// 注意:原碼逐字節 update 效率極低,建議改為 md.update(buffer)
for (int i = 0; i < buffer.length; i++) {
md.update(buffer, 0, i + 1); // 原碼邏輯保留,實務請優化
}
byte[] digest = md.digest();
return new BigInteger(1, digest).toString(16); // 1 表示正數,避免負號
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("MD5 algorithm not found", e);
}
}
}
MessageDigest.getInstance("MD5") 取得演算法實例。md.update() 可分批輸入資料,適合大檔案流式處理。md.digest() 完成雜湊計算,回傳 16 位元組陣列。BigInteger(1, bytes).toString(16) 將位元組轉十六進制字串(補齊前導零需自行處理)。toString(16) 為 16 進制,toString(32) 為 32 進制等。e10adc3949ba59abbe56e057f20f883e
注意:MD5 已不適合密碼儲存等安全敏感場景,建議改用 BCrypt、PBKDF2 或 Argon2。