package vip.xiaonuo.common.util;

import cn.hutool.core.util.RandomUtil;

import java.util.Random;

/**
 * 提供通用唯一识别码（universally unique identifier）（UUID）实现
 *
 * @author xianghao
 * @Date 2021/10/15
 */
public class HexUtils {

    //组成元素62位
    private static String str62 = "ZXCVBNMASDFGHJKLQWERTYUIOPzxcvbnmasdfghjklqwertyuiop1234567890";
    //组成元素16位
    private static String str16 = "abcdef1234567890";
    //组成元素10位
    private static String str10 = "1234567890";
    //随机工具
    private static Random random = new Random();

    /**
     * 生成62进制密钥
     *
     * @param length：密钥长度
     * @return String
     */
    public static String getByte62UUID(int length) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < length; i++) {
            sb.append(str62.charAt(random.nextInt(62)));
        }
        return sb.toString();
    }

    /**
     * 生成16进制数
     *
     * @param length：密钥长度
     * @return 16进制数
     */
    public static String getByte16UUID(int length) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < length; i++) {
            sb.append(str16.charAt(random.nextInt(16)));
        }
        return sb.toString();
    }

    /**
     * 生成10进制密钥
     *
     * @param length：密钥长度
     * @return String
     */
    public static String getByte10UUID(int length) {
        return RandomUtil.randomString(str10, length);
    }

    /**
     * 生成 11位时间戳+8位密钥
     *
     * @return Long
     */
    public static Long getByteTime11UUID8() {
        return Long.parseLong(System.currentTimeMillis() / 100 + HexUtils.getByte10UUID(8));
    }


    /**
     * 生成 13位时间戳+6位密钥
     *
     * @return Long
     */
    public static String getByteTime13UUID6() {
        return System.currentTimeMillis() + HexUtils.getByte16UUID(6);
    }

    /**
     * 生成 14位时间+5位16进制随机
     *
     * @return String
     */
    public static String getByteTime14UUID5() {
        return DatesUtil.forDateTimeAll14() + HexUtils.getByte16UUID(5);
    }

    /**
     * 生成 17位时间+2位16进制随机
     *
     * @return String
     */
    public static String getByteTime17UUID2() {
        return DatesUtil.forDateTimeAll17() + HexUtils.getByte16UUID(2);
    }

    /**
     * 生成 17位时间+2位16进制随机
     *
     * @return String
     */
    public static String getByteTime10UUID7() {
        return DatesUtil.forDateTimeAll10() + HexUtils.getByte16UUID(7);
    }

}
