java String计算MD5的三种方法以及文件计算MD5的方法

MD5简介

MD5,Message Digest Algorithm 5,是一种被广泛使用的信息摘要算法,可以将给定的任意长度数据通过一定的算法计算得出一个128位``二进制的散列值。

常见的表示方法是将128位二进制转成32位16进制,这样看起来比较简短。

方法1

这种方法要注意一点的是不足32位高位需补零,否则会不足位,比如:

6531经MD5计算后正确的结果为0a7d83f084ec258aefd128569dda03d7

用方法1如果不高位补零返回的结果为a7d83f084ec258aefd128569dda03d7,前面的0少了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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;
}

Click and drag to move

方法2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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;
}

Click and drag to move

方法3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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;
}

Click and drag to move

计算文件的MD5值

任何文件都可以计算MD5值,因为任何文件实际上就是字节数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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;
}

Click and drag to move

大写的MD5

以上三种方法返回的MD5值包含的字母都是小写的,如果想返回大写的直接在方法返回前用toUpperCase就可以了,不再赘述

1
2
3
4
public static String MD5(String input) {
// 省略计算MD5代码
return result.toUpperCase();
}