package shop.alien.util.encryption;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * MD5加密后的位数有两种类型：16位与32位，默认使用32位。
 * 16位实际上是从32位字符串中取中间的第9位到第24位的部分
 *
 * @author ssk
 * @version 1.0
 * @date 2020/1/17 10:24
 */
public class Md5Util {

    /**
     * 加密转大写
     *
     * @param str    加密字符串
     * @param length 长度
     * @return String
     */
    public String createMd5Str(String str, Integer length) {
        try {
            String md5Result;
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(str.getBytes());
            byte[] b = md.digest();
            int i;
            StringBuilder buf = new StringBuilder();
            for (byte value : b) {
                i = value;
                if (i < 0) i += 256;
                if (i < 16) buf.append("0");
                buf.append(Integer.toHexString(i));
            }
            if (null != length && length == 16) {
                md5Result = buf.substring(8, 24);
            } else {
                md5Result = buf.toString();
            }
            return md5Result;
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("MD5加密出错！！+" + e);
        }
    }

    /**
     * 加密转大写
     *
     * @param str    加密字符串
     * @param length 长度
     * @return String
     */
    public String createMd5StrToUpperCase(String str, Integer length) {
        return createMd5Str(str, length).toUpperCase();
    }

    public static void main(String[] args) {
        Md5Util md5Util = new Md5Util();
        System.out.println(md5Util.createMd5Str("123456", 32));
        System.out.println(md5Util.createMd5Str("123456", 16));
        System.out.println(md5Util.createMd5StrToUpperCase("123456", 32));
        System.out.println(md5Util.createMd5StrToUpperCase("123456", 16));
    }
}
