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

24 July 2015

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


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

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值略麻烦一点:

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