package com.cdl.test; import java.security.MessageDigest; import java.util.Arrays; /** * 功能:测试MessageDigest的MD5
* 参考:http://apps.hi.baidu.com/share/detail/20189800
* http://zhidao.baidu.com/question/163063912.html
* @author [email protected]
* @date 2011-12-7
* @version 1.0
* */ public class TestMD5 { /** * @param args */ public static void main(String[] args) throws Exception { String md5 = getMD5Mask("cdl"); System.out.println(md5); /** * 输出结果:
* [11, 29, -82, -22, -37, -62, 17, 60, -93, 96, 38, 93, -58, 0, -91,14]
* 0b 1d ae ea db c2 11 3c a3 60 26 5d c6 00 a5 0e * */ } /** * 1. byte(8位有符号)的取值范围是 -128-127, char(16位无符号)的取值范围是0-65535;
* 2.如果一个byte对应的十六进制数只有一位前面要用0填充,因为MD5是32位的,达到统一的格式
* 3.0x是十六进制的标示,比如:0xFF表示8位的二进制1111 1111;0x00FF表示16位的二进制0000 0000 1111 1111 * */ public static String getMD5Mask(String str) throws Exception { MessageDigest messageDigest = null; // 获得一个肚子 messageDigest = MessageDigest.getInstance("MD5"); // 把肚子清空 messageDigest.reset(); // 在肚子里放入东西 messageDigest.update(str.getBytes("UTF-8")); // 消化放入的东西得到目标营养 byte[] byteArray = messageDigest.digest(); System.out.println(Arrays.toString(byteArray)); StringBuffer md5StrBuff = new StringBuffer(); for (int i = 0; i < byteArray.length; i++) { if (Integer.toHexString(0xFF & byteArray[i]).length() == 1) md5StrBuff.append("0").append( Integer.toHexString(0xFF & byteArray[i])); else md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i])); } return md5StrBuff.toString(); } }
添加一个查看byte二进制位的功能
package com.cdl.test; import java.security.MessageDigest; import java.util.Arrays; /** * 功能:测试MessageDigest的MD5
* 参考:http://apps.hi.baidu.com/share/detail/20189800 * * @author [email protected]
* @date 2011-12-7
* @version 1.0
* */ public class TestMD5 { /** * @param args */ public static void main(String[] args) throws Exception { String md5 = getMD5Mask("cdl"); System.out.println(md5); /** * 输出结果:
* [11, 29, -82, -22, -37, -62, 17, 60, -93, 96, 38, 93, -58, 0, -91,14]
* 0b 1d ae ea db c2 11 3c a3 60 26 5d c6 00 a5 0e * */ } /** * 参考:http://zhidao.baidu.com/question/163063912.html
* 1. byte(8位有符号)的取值范围是 -128-127, char(16位无符号)的取值范围是0-65535,
* 所以需要& 0xFF 使得byte原来的负值变成正的;
* 2.如果一个byte对应的十六进制数只有一位前面要用0填充,因为MD5是32位的,达到统一的格式
* 3.0x是十六进制的标示,比如:0xFF表示8位的二进制1111 1111;0x00FF表示16位的二进制0000 0000 1111 1111 * */ public static String getMD5Mask(String str) throws Exception { MessageDigest messageDigest = null; // 获得一个肚子 messageDigest = MessageDigest.getInstance("MD5"); // 把肚子清空 messageDigest.reset(); // 在肚子里放入东西 messageDigest.update(str.getBytes("UTF-8")); // 消化放入的东西得到目标营养 byte[] byteArray = messageDigest.digest(); System.out.println(Arrays.toString(byteArray)); StringBuffer md5StrBuff = new StringBuffer(); String bitArray = null; for (int i = 0; i < byteArray.length; i++) { bitArray = Integer.toBinaryString(byteArray[i]); if (bitArray.length() > 8) { System.out.println(bitArray.substring(24)); } else System.out.println(bitArray); if (Integer.toHexString(0xFF & byteArray[i]).length() == 1) md5StrBuff.append("0").append( Integer.toHexString(0xFF & byteArray[i])); else md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i])); } return md5StrBuff.toString(); } }
输出:
[11, 29, -82, -22, -37, -62, 17, 60, -93, 96, 38, 93, -58, 0, -91, 14] 1011 11101 10101110 11101010 11011011 11000010 10001 111100 10100011 1100000 100110 1011101 11000110 0 10100101 1110 0b1daeeadbc2113ca360265dc600a50e
.