天天看点

简单MD5加密类

/**
 * MD5加密类
 * Created by one on 2017/4/25.
 */
public class getMD5 {
    //加密
    public static String encode(String str) {
        if (str == null || "".equals(str)) {
            return null;
        }
        StringBuffer sb = new StringBuffer();
        try {
            MessageDigest code = MessageDigest.getInstance("MD5");

            code.update(str.getBytes());
            byte[] bs = code.digest();//使用字节数组对摘要进行最后更新
            for (int x:bs) {
                x=x&;//将byte转换成int
                if (x < ) {
                    sb.append();
                }
                sb.append(Integer.toHexString(x));//sb添加转码后的字符串
            }
        }catch (NoSuchAlgorithmException e){
            e.printStackTrace();
        }
        return sb.toString().toUpperCase();//将得到的字节数组变成字符串返回
    }

//看一下效果
   // public static void main(String[] agrs){

   //     System.out.print(getMD5("one"));
    //}
}
           

注:为什么将byte转换成int 要和 0xff 进行与运算?

Java中的byte是一个字节保存的(8位),int是4个字节(32位),而 Integer.toHexString的参数是int ,当byte强制转换成int时,对于负数,会做位扩展。比如一个byte的-1(0×ff)会变成int的-1(0×ffffffff),这样转换出来的结果就有问题

而0×ff默认是整形,一个byte跟0×ff相与 会先将那个byte转换成整形运算,这样,结果中后24个比特总会被请0,这样结果就没什么问题了