Java|java String计算MD5的三种方法以及文件计算MD5的方法

MD5简介
MD5,Message Digest Algorithm 5,是一种被广泛使用的信息摘要算法,可以将给定的任意长度数据通过一定的算法计算得出一个128位二进制的散列值。
【Java|java String计算MD5的三种方法以及文件计算MD5的方法】常见的表示方法是将128位二进制转成32位16进制,这样看起来比较简短。
方法1
这种方法要注意一点的是不足32位高位需补零,否则会不足位,比如:
6531经MD5计算后正确的结果为0a7d83f084ec258aefd128569dda03d7
用方法1如果不高位补零返回的结果为a7d83f084ec258aefd128569dda03d7,前面的0少了

public static String MD51(String input) { if(input == null || input.length() == 0) { return null; } try { MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.update(input.getBytes()); byte[] byteArray = md5.digest(); BigInteger bigInt = new BigInteger(1, byteArray); // 参数16表示16进制 String result = bigInt.toString(16); // 不足32位高位补零 while(result.length() < 32) { result = "0" + result; } return result; } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; }


方法2
public static String MD52(String input) { if(input == null || input.length() == 0) { return null; } try { MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.update(input.getBytes()); byte[] byteArray = md5.digest(); char[] hexDigits = {'0','1','2','3','4','5','6','7','8','9', 'a','b','c','d','e','f'}; // 一个字节对应两个16进制数,所以长度为字节数组乘2 char[] charArray = new char[byteArray.length * 2]; int index = 0; for (byte b : byteArray) { charArray[index++] = hexDigits[b>>>4 & 0xf]; charArray[index++] = hexDigits[b & 0xf]; } return new String(charArray); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; }

方法3
private static String MD53(String input) { if(input == null || input.length() == 0) { return null; } try { MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.update(input.getBytes()); byte[] byteArray = md5.digest(); StringBuilder sb = new StringBuilder(); for (byte b : byteArray) { // 一个byte格式化成两位的16进制,不足两位高位补零 sb.append(String.format("%02x", b)); } return sb.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; }

计算文件的MD5值
任何文件都可以计算MD5值,因为任何文件实际上就是字节数组
public static String fileToMD5(String path){ try { MessageDigest md5 = MessageDigest.getInstance("MD5"); FileInputStream fis = new FileInputStream(path); byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) != -1) { md5.update(buffer, 0, len); } fis.close(); byte[] byteArray = md5.digest(); StringBuilder sb = new StringBuilder(); for (byte b : byteArray) { sb.append(String.format("%02x", b)); } return sb.toString(); } catch (IOException | NoSuchAlgorithmException e){ e.printStackTrace(); } return null; }

大写的MD5
以上三种方法返回的MD5值包含的字母都是小写的,如果想返回大写的直接在方法返回前用toUpperCase就可以了,不再赘述
public static String MD5(String input) { // 省略计算MD5代码 return result.toUpperCase(); }


    推荐阅读