利用JavaAPI中自带的java.security,MessageDigest可以实现(同时需要注意的还有十六进制,char字符,byte字符转化问题)
/**
* MD5压缩算法
* @param source
* @return
*/
public static String getMD5(byte[] source){
String s = null;
char hexDigits[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
try{
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(source);
byte[] tmp = md.digest();//返回值为8位字符串,16byte,16*8 bits,16*2 十六进制数
//System.out.println(tmp.toString());
char[] str = new char[16*2];//char占用两字节转化成十六进制需要32个字符
int k = 0;
for(int i = 0; i < 16; i ++){
byte byte0 = tmp[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];//0xf是低四位为1其余为0的数,与运算为取出低四位
str[k ++] = hexDigits[byte0 & 0xf];//后四位转化,一个byte两个bit
}
s = new String(str);
}catch(Exception e){
e.printStackTrace();
}
return s;
}
测试代码:
public static void main(String[] args){
System.out.println(getMD5("qing".getBytes()));
StringBuffer buf = new StringBuffer();
char hexDigits[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
int x = 445529;
//循环输出int的十六进制形式,int占四个字节,共32位,有八个四位,需要循环8次
for(int i = 0; i < 8; i ++){
buf.append(hexDigits[x&0xf]);
x = x >> 4;
}
System.out.println(buf.reverse().toString());
}
测试结果:
834af260d56e6b7b01199548065ac7da
0006cc59