如何用Java生成指定格式的128位MD5哈希(Base64编码,44位)?
解决方案
你需要的44位Base64字符串,并非MD5哈希字节数组直接编码的结果,而是先将MD5哈希转为32位十六进制字符串,再对该字符串的字节数组进行Base64编码得到的。
正确实现代码
import java.security.MessageDigest; import java.util.Base64; public class Md5HexToBase64 { public static void main(String[] args) throws Exception { byte[] part = "your_input_data".getBytes("UTF-8"); // 替换为你的输入字节数组 // 1. 计算MD5哈希值 MessageDigest md = MessageDigest.getInstance("MD5"); byte[] md5Digest = md.digest(part); // 2. 将MD5字节数组转为32位小写十六进制字符串 StringBuilder hexStrBuilder = new StringBuilder(); for (byte b : md5Digest) { // 确保每个字节转为两位十六进制字符,不足补0 String hex = Integer.toHexString(0xFF & b); if (hex.length() == 1) { hexStrBuilder.append('0'); } hexStrBuilder.append(hex); } String md5Hex = hexStrBuilder.toString(); // 3. 将十六进制字符串按UTF-8编码为字节数组,再做Base64编码 String finalBase64 = Base64.getEncoder().encodeToString(md5Hex.getBytes("UTF-8")); System.out.println(finalBase64); // 输出44位的目标格式字符串 } }
为什么之前的方法不符合预期
你之前直接对MD5的16字节哈希数组做Base64编码,得到的是24位(含等号)的字符串,这是因为16字节的Base64编码长度为((16 + 2) / 3) * 4 = 24。而你需要的44位结果,是基于32位十六进制字符串的Base64编码,32字节的Base64编码长度为((32 + 2) / 3) * 4 = 44,完全匹配示例格式。
内容的提问来源于stack exchange,提问作者Ivan B
相关产品推荐
相关产品推荐

