MD5的工具方法使用


package com.cdl.test;

import java.security.MessageDigest;
import java.util.Arrays;

/**
* 功能:测试MessageDigest的MD5<BR>
* 参考:http://apps.hi.baidu.com/share/detail/20189800<BR>
* http://zhidao.baidu.com/question/163063912.html<BR>
* @author ocaicai@yeah.net<BR>
* @date 2011-12-7<BR>
* @version 1.0 <BR>
*
*/
public class TestMD5 {

/**
* @param args
*/
public static void main(String[] args) throws Exception {
String md5 = getMD5Mask("cdl");
System.out.println(md5);
/**
* 输出结果:<BR>
* [11, 29, -82, -22, -37, -62, 17, 60, -93, 96, 38, 93, -58, 0, -91,14]<BR>
* 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;<BR>
* 2.如果一个byte对应的十六进制数只有一位前面要用0填充,因为MD5是32位的,达到统一的格式<BR>
* 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();
}
}




[color=violet]添加一个查看byte二进制位的功能[/color]

package com.cdl.test;

import java.security.MessageDigest;
import java.util.Arrays;

/**
* 功能:测试MessageDigest的MD5<BR>
* 参考:http://apps.hi.baidu.com/share/detail/20189800
*
* @author ocaicai@yeah.net<BR>
* @date 2011-12-7<BR>
* @version 1.0 <BR>
*
*/
public class TestMD5 {

/**
* @param args
*/
public static void main(String[] args) throws Exception {
String md5 = getMD5Mask("cdl");
System.out.println(md5);
/**
* 输出结果:<BR>
* [11, 29, -82, -22, -37, -62, 17, 60, -93, 96, 38, 93, -58, 0, -91,14]<BR>
* 0b 1d ae ea db c2 11 3c a3 60 26 5d c6 00 a5 0e
* */

}

/**
* 参考:http://zhidao.baidu.com/question/163063912.html<BR>
* 1. byte(8位有符号)的取值范围是 -128-127, char(16位无符号)的取值范围是0-65535,<BR>
* 所以需要& 0xFF 使得byte原来的负值变成正的;<BR>
* 2.如果一个byte对应的十六进制数只有一位前面要用0填充,因为MD5是32位的,达到统一的格式<BR>
* 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




.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值