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) { } } }
return result; }
|
如果文件较大,这个计算过程可能会比较长。
sha1 和 sha256 的计算方法就很类似了,只需要将 MessageDigest.getInstance("MD5")
换一下就可以用了。go 版本的 hash 计算请查看 go-hash。