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

MD5简介

MD5,Message Digest Algorithm 5,是一种被广泛使用的信息摘要算法,可以将给定的任意长度数据通过一定的算法计算得出一个128位二进制的散列值。

常见的表示方法是将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();
}

 

posted @ 2019-03-25 21:07  野猿新一  阅读(68)  评论(0编辑  收藏  举报