public class Md5 {
public static void main(String[] args) {
String pwd = "123456";
try {
// 生成一个MD5加密计算摘要
MessageDigest md = MessageDigest.getInstance("MD5");
// 加密
md.update(pwd.getBytes());
//得到加密后的字节数组
byte[] digest = md.digest();
//输出为:[-31, 10, -36, 57, 73, -70, 89, -85, -66, 86, -32, 87, -14, 15, -120, 62]
System.out.println(Arrays.toString(digest));
//将字节数组转成16进制字符输出(0X后面的那些)
String str = bytesToHexString(digest);
//e10adc3949ba59abbe56e057f20f883e
System.out.println(str);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
public static String bytesToHexString(byte[] src){
StringBuilder stringBuilder = new StringBuilder("");
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}
}
来看bytesToHexString方法里的两步
//10000000 00000000 00000000 00011111 十进制 -31
// ↓转补码
//01111111 11111111 11111111 11100001 补码
// &
//00000000 00000000 00000000 11111111 0XFF
// =
//00000000 00000000 00000000 11100001 十进制 225
// ↓转16进制
// e1
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
在此案例中,加密后得十进制数组为第一个数为-31
进入第一次循环,第一步:-31与0xFF做与运算得到225
第二步:225在转成16进制得到e1
就是加密结果中的前俩字符
后续循环,就是如此