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小时内删除。