MD5算法

/*
 *  MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。
 * 信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。 
   MessageDigest 对象开始被初始化。
 * 在调用 digest 之后,MessageDigest 对象被重新设置成其初始状态。
 * 
 * MessageDigest类也是一个工厂类,其构造器是受保护的,不允许
    直接使用new MessageDigist( )来创建对象,而必须通过其静态方法getInstance( )生成MessageDigest对象。
    其中传入的参数指定计算消息摘要所使用的算法,常用的有"MD5","SHA"等。
    
    update 传入的参数是字节类型或字节类型数组,对于字符串,需要先使用 getBytes( ) 方法生成字符串数组。
 */

public class MD5Util {
     //以16进制进行转换
    private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5",
            "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
    /**
     * @param b 完成哈希计算得到的byte[] 数组
     */
    private static String byteArrayToHexString(byte b[]) {
        StringBuffer resultSb = new StringBuffer();
        for (int i = 0; i < b.length; i++)
            resultSb.append(byteToHexString(b[i]));

        return resultSb.toString();
    }

    private static String byteToHexString(byte b) {
        int n = b;
        if (n < 0)
            n += 256;
        int d1 = n / 16;
        int d2 = n % 16;
        return hexDigits[d1] + hexDigits[d2];
    }
    /**
     * 
     * @param origin 需要加密的内容
     * @param charsetname 指定字符集
     */
    public static String MD5Encode(String origin, String charsetname) {
        String resultString = null;
        try {
            resultString = new String(origin);
            MessageDigest md = MessageDigest.getInstance("MD5");//创建MessageDigest对象
            if (charsetname == null || "".equals(charsetname))
                resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
            else
                resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));//使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。 
        } catch (Exception exception) {
        }
        return resultString;
    }
}

 

public class MD5Test {
     public final static String md5(String s){
            //以16进制进行转换
            char[] hexDigits={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
            try{
                //将字符创变为字节数组
                byte[] strTemp = s.getBytes();
                //创建MessageDigest对象
                MessageDigest mdTemp = MessageDigest.getInstance("MD5");
                //使用strTemp字节数组更新mdTemp摘要
                mdTemp.update(strTemp);
                //通过填充之类的相关操作完成哈希计算
                byte[] digest = mdTemp.digest();
                System.out.println("byte[] digest:   "+Arrays.toString(digest));
                // 得到哈希算法之后的长度
                int j=digest.length;
                //创建一个新的字符数组,长度为digest的两倍,用于创建新的字符串
                char[] newChar=new char[2*j];
                for(int i=0,k=0;i<j;i++){
                    byte b=digest[i];
                    newChar[k++]=hexDigits[b>>>4&0xf];//奇数位的位运算
                    newChar[k++]=hexDigits[b&0xf];//偶数位的位运算
                }
                //返回一个新的字符串
                return new String(newChar);
            }catch(Exception e){
                return null;
            }
        }
     public static void main(String[] args) {
            String md5 = MD5Test.md5("b");
            System.out.println("md5:    "+md5);
            //第1次输出值           md5:    92eb5ffee6ae2fec3ad71c777531578f
            //第2次输出值           md5:    92eb5ffee6ae2fec3ad71c777531578f
            //从这里看出   值不是随意生成的,给定更新数据,则每次生成的值都一样
        }
}

 

public class MD5 {

    public static String md5(String str) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(str.getBytes());//更新md摘要
            byte b[] = md.digest();//完成哈希计算

            StringBuffer buf = new StringBuffer("");
            for (int offset = 0, i=0; offset < b.length; offset++) {
                i = b[offset];
                if (i < 0)
                    i += 256;//java中的byte类型的取值范围是-128~127
                if (i < 16)
                    buf.append("0");
                buf.append(Integer.toHexString(i));// 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式。
            }
            str = buf.toString();
        } catch (Exception e) {
            e.printStackTrace();

        }
        return str;
    }
    public static void main(String[] args) {
        System.out.println(md5("31119@qq.com"+"123456"));
        System.out.println(md5("mj1"));
        System.out.println(md5("gaozhen"));
    }
}

 

 

转载于:https://my.oschina.net/u/3387637/blog/1305435

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值