MD5,Message Digest Algorithm 5,是一种被广泛使用的信息摘要算法,可以将给定的任意长度数据通过一定的算法计算得出一个128位
二进制的
散列值。
常见的表示方法是将128位二进制转成32位16进制,这样看起来比较简短。
这种方法要注意一点的是不足32位高位需补零,否则会不足位,比如:
6531经MD5计算后正确的结果为0a7d83f084ec258aefd128569dda03d7
用方法1如果不高位补零返回的结果为a7d83f084ec258aefd128569dda03d7,前面的0少了
public static String MD51(String input) {
if(input == null || input.length() == 0) {
return null;
}
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(input.getBytes());
byte[] byteArray = md5.digest();
BigInteger bigInt = new BigInteger(1, byteArray);
// 参数16表示16进制
String result = bigInt.toString(16);
// 不足32位高位补零
while(result.length() < 32) {
result = "0" + result;
}
return result;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
public static String MD52(String input) {
if(input == null || input.length() == 0) {
return null;
}
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(input.getBytes());
byte[] byteArray = md5.digest();
char[] hexDigits = {'0','1','2','3','4','5','6','7','8','9', 'a','b','c','d','e','f'};
// 一个字节对应两个16进制数,所以长度为字节数组乘2
char[] charArray = new char[byteArray.length * 2];
int index = 0;
for (byte b : byteArray) {
charArray[index++] = hexDigits[b>>>4 & 0xf];
charArray[index++] = hexDigits[b & 0xf];
}
return new String(charArray);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
private static String MD53(String input) {
if(input == null || input.length() == 0) {
return null;
}
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(input.getBytes());
byte[] byteArray = md5.digest();
StringBuilder sb = new StringBuilder();
for (byte b : byteArray) {
// 一个byte格式化成两位的16进制,不足两位高位补零
sb.append(String.format("%02x", b));
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
任何文件都可以计算MD5值,因为任何文件实际上就是字节数组
public static String fileToMD5(String path){
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
FileInputStream fis = new FileInputStream(path);
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
md5.update(buffer, 0, len);
}
fis.close();
byte[] byteArray = md5.digest();
StringBuilder sb = new StringBuilder();
for (byte b : byteArray) {
sb.append(String.format("%02x", b));
}
return sb.toString();
} catch (IOException | NoSuchAlgorithmException e){
e.printStackTrace();
}
return null;
}
以上三种方法返回的MD5值包含的字母都是小写的,如果想返回大写的直接在方法返回前用toUpperCase就可以了,不再赘述
public static String MD5(String input) {
// 省略计算MD5代码
return result.toUpperCase();
}