Java 中计算字符串以及文件的 hash 值

Android 开发中常常会使用到 hash 值,字符串的 hash 用的比较多,一般用于字段、存储的 key 等等,文件的 hash 一般用于校验文件的正确性,记录下最简单的方式。

计算字符串的 hash 值,网上也有其他的计算方法,这里给出一个相对简洁的方法:

1
2
3
4
5
6
7
8
9
10
11
public static String md5(String origin) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(origin.getBytes("UTF-8"));
BigInteger bi = new BigInteger(1, md.digest());

return bi.toString(16);
} catch (Exception e) {
return "";
}
}

注意要把字符串用 utf-8 的方式获取 byte,否则会导致不用语言之间得出的结果不一样(比如 php 或 go)。
计算文件的 hash 值略麻烦一点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public static String fileHash(String filePath) {
File file = new File(filePath);
if (file == null || !file.exists()) {
return NULL;
}

String result = NULL;
FileInputStream fis = null;

try {
fis = new FileInputStream(file);
MappedByteBuffer mbf = fis.getChannel().map(
FileChannel.MapMode.READ_ONLY, 0, file.length());
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(mbf);
BigInteger bi = new BigInteger(1, md.digest());
result = bi.toString(16);
} catch (Exception e) {
return NULL;
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
/* ignore */
}
}
}

return result;
}

如果文件较大,这个计算过程可能会比较长。

sha1 和 sha256 的计算方法就很类似了,只需要将 MessageDigest.getInstance("MD5") 换一下就可以用了。go 版本的 hash 计算请查看 go-hash