在工作中,总是习惯调用jar包中的方法,却从没有字节去实现,趁现在,学习下
public class LearnMessageDigest {
static String charset ="utf-8";
//当然还有其他实现方式MD5思想都是 一样的。
public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException {
//目前java1.7中 ,MessageDigest支持6种消息摘要算法
//MD5 MD2 SHA(SHA-1) SHA-256 SHA-384 SHA-512
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
//进行摘要计算后返回16个字节
byte[] digest = messageDigest.digest("liumuen".getBytes(charset));//生成摘要字节后。
//a3a32ec59e492993d9dee13dca8b895b
//a3a32ec59e492993d9dee13dca8b895b
System.out.println(byteToHexString(digest));
System.out.println(messageDigest.getProvider());
System.out.println(messageDigest.getDigestLength());
}
static String byteToHexString(byte[] bytes){
char [] basechar = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
char[] res = new char[bytes.length * 2]; //结果为32位char,转为16进制时一个字节 对应两个16进制字符
for (int i = 0 , j = 0;i < bytes.length;i++) {//对传递进来的16个字节遍历,
//对某个字节的 前4位进行 带符号右移四位,如果这个自己 为负数那么移位后结果为1000+原本字节前4位,
与16进制的00001111进行&运算,那么符号为为0,结果为0000+原本字节前4位。然后就得到一个数,转为char
res[j++] = basechar[ bytes[i] >> 4 & 0x0f];
//某个字节的后4位进行00001111的&运算,结果就是原本字节的后四位,
res[j++] = basechar[ bytes[i] & 0x0f];
}
return new String(res);
}
}