JAVA中获取⽂件MD5值的四种⽅法
JAVA中获取⽂件MD5值的四种⽅法其实都很类似,因为核⼼都是通过JAVA⾃带的MessageDigest类来实现。获取⽂件MD5值主要分为三个步骤,第⼀步获取⽂件的byte信息,第⼆步通过MessageDigest类进⾏MD5加密,第三步转换成16进制的MD5码值。⼏种⽅法的不同点主要在第⼀步和第三步上。具体可以看下⾯的例⼦:
⽅法⼀、
1 private final static String[] strHex = { "0", "1", "2", "3", "4", "5",
2 "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
3
4 public static String getMD5One(String path) {
5 StringBuffer sb = new StringBuffer();
6 try {
7 MessageDigest md = Instance("MD5");
8 byte[] b = md.adFileToByteArray(new File(path)));
9 for (int i = 0; i < b.length; i++) {
10 int d = b[i];
11 if (d < 0) {
12 d += 256;
13 }
14 int d1 = d / 16;
15 int d2 = d % 16;
16 sb.append(strHex[d1] + strHex[d2]);
17 }
18 } catch (NoSuchAlgorithmException e) {
19 e.printStackTrace();
20 } catch (IOException e) {
21 e.printStackTrace();
22 }
23 String();
24 }
⽅法⼀是⽐较原始的⼀种实现⽅法,⾸先将⽂件⼀次性读⼊内存,然后通过MessageDigest进⾏MD5加密,最后再⼿动将其转换为16进制的MD5值。
⽅法⼆、
1 public static String getMD5Two(String path) {
2 StringBuffer sb = new StringBuffer("");
3 try {
4 MessageDigest md = Instance("MD5");
5 md.adFileToByteArray(new File(path)));
6 byte b[] = md.digest();
7 int d;
8 for (int i = 0; i < b.length; i++) {
9 d = b[i];
10 if (d < 0) {
11 d = b[i] & 0xff;
12 // 与上⼀⾏效果等同
13 // i += 256;
14 }
15 if (d < 16)
16 sb.append("0");
17 sb.HexString(d));
18 }
19 } catch (NoSuchAlgorithmException e) {
20 e.printStackTrace();
21 } catch (IOException e) {
22 e.printStackTrace();
23 }
24 String();
25 }
⽅法⼆与⽅法⼀不同的地⽅主要是在步骤三,这⾥借助了Integer类的⽅法实现16进制的转换,⽐⽅法⼀更简洁⼀些。PS:JAVA中byte 是有负数的,代码中&0xff的操作与计算机中数据存储的原理有关,即负数存储的是⼆进制的补码,有兴趣的童鞋可以挖⼀下,这⾥不展开说。
⽅法三、
1 public static String getMD5Three(String path) {
2 BigInteger bi = null;
java的tostring方法3 try {
4 byte[] buffer = new byte[8192];
5 int len = 0;
6 MessageDigest md = Instance("MD5");
7 File f = new File(path);
8 FileInputStream fis = new FileInputStream(f);
9 while ((len = ad(buffer)) != -1) {
10 md.update(buffer, 0, len);
11 }
12 fis.close();
13 byte[] b = md.digest();
14 bi = new BigInteger(1, b);
15 } catch (NoSuchAlgorithmException e) {
16 e.printStackTrace();
17 } catch (IOException e) {
18 e.printStackTrace();
19 }
20 String(16);
21 }
⽅法三与前⾯两个⽅法相⽐,在读⼊⽂件信息上有点不同。这⾥是分多次将⼀个⽂件读⼊,对于⼤型⽂件⽽⾔,⽐较推荐这种⽅式,占⽤内存⽐较少。步骤三则是通过BigInteger类提供的⽅法进⾏16进制的转换,与⽅法⼆类似。
⽅法四、
1 DigestUtils.md5Hex(new FileInputStream(path));
⽅法四应该是最便捷的吧,哈哈,好东西要留在最后,如果你只需要使⽤标准的MD5,其实⼀⾏代码就够了,JAVA⾃带的commons-codec包就提供了获取16进制MD5值的⽅法。其底层实现上,也是分多次将⼀个⽂件读⼊,类似⽅法三。所以性能上也不错。
总结:其实⽅法都是类似的,推荐使⽤⽅法四,简洁且性能不错,当然,如果要做⼀些调整什么的,可以根据⾃⼰的需求进⾏⽅法的选择。
PS:其实还有⼀个重点,就是如何知道⾃⼰⽣成的MD5值是否正确呢?
⽅法很多,其实有⼀个挺简单的⽅法,不需要另外安装什么软件。使⽤windows⾃带的命令即可:certutil -hashfile [⽂件路径] MD5,例⼦如下:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论