生成指定位数随机码工具类

/*
 * 生成指定位数随机码
 * 范围 1-9 a-z
 */

package com.yiwei.common.utils;

import java.util.Random;
import java.util.UUID;

import cn.hutool.core.util.RandomUtil;
import org.springframework.stereotype.Service;


public class CodeUtil {

    private static final int MIX_CAPITALIZATION = 50;

    private static final int BASE_HYBRID_PARAM = 92579527;

    private static final int MUTEX_HYBRID_PARAM = 952795;

    private static final int MINI_LENGTH = 1000000;

    private static final int DEFAULT_CHAR_NUM = 15;

    private static final int DEFAULT_POST_CHAR = '9';

    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
//        通过传入ID的hashCode即可得到唯一的 随机n位字符串
            String id = UUID.randomUUID().toString().replace("-", "");
            System.out.println(CodeUtil.getRandom(id.hashCode(), true, true, false, 6));
        }
    }

    /**
     * 获取随机验证码
     *
     * @param charNum 位数
     * @return
     */
    public static String getCode(Integer charNum) {
        String id = UUID.randomUUID().toString().replace("-", "");
        return CodeUtil.getRandom(id.hashCode(), true, true, false, 6);
    }

    /**
     * 生成随机字符串
     *
     * @param hybrid  杂化参数
     * @param needCap 大写杂化
     * @param needLow 小写杂化
     * @param ztO     0 to O  零转欧
     * @param charNum 字符串位数限制,为0则为默认值,小于0则不设限制
     * @return 字符串
     */
    public static String getRandom(long hybrid, boolean needCap, boolean needLow, boolean ztO, int charNum) {
        Random randomRan = new Random(System.currentTimeMillis() * System.currentTimeMillis());
        long randomLong = randomRan.nextLong();
        if (randomLong > hybrid * BASE_HYBRID_PARAM) {
            randomLong = randomLong - hybrid * MUTEX_HYBRID_PARAM;
        } else if (randomLong - hybrid < MINI_LENGTH) {
            randomLong = (randomLong - hybrid) * MUTEX_HYBRID_PARAM;
        } else {
            randomLong = randomLong - hybrid;
        }
        String randomStr = String.valueOf(Math.abs(randomLong));
        StringBuilder random = new StringBuilder();
        for (int count = 0; count < randomStr.length() - 1; ++count) {
            String subStr = randomStr.substring(count, count + 2);
            int subNum = Integer.parseInt(subStr);
            if (needCap && 'A' < subNum && 'Z' > subNum) {
                random.append((char) subNum);
            } else if (needLow && 'a' < subNum + MIX_CAPITALIZATION && 'z' > subNum + MIX_CAPITALIZATION) {
                random.append((char) (subNum + MIX_CAPITALIZATION));
            } else {
                if (needCap && ztO && 0 == Integer.parseInt(randomStr.substring(count, count + 1))) {
                    random.append('O');
                } else {
                    random.append(randomStr, count, count + 1);
                }
            }
        }
        random.append(randomStr, randomStr.length() - 1, randomStr.length());
        return charNum(charNum, random);
    }

    /**
     * 字符串位数限制处理
     */
    private static String charNum(int charNum, StringBuilder random) {
        //check char num
        int activeCharNum;
        if (0 == charNum) {
            activeCharNum = DEFAULT_CHAR_NUM;
        } else if (charNum > 0) {
            activeCharNum = charNum;
        } else {
            return random.toString();
        }
        //deal char num
        StringBuilder randomFormatted = new StringBuilder();
        if (random.length() > activeCharNum) {
            randomFormatted.append(random.substring(0, activeCharNum));
        }
        if (random.length() < activeCharNum) {
            int diff = activeCharNum - random.length();
            randomFormatted.append(random);
            while (0 < diff--) {
                randomFormatted.append(DEFAULT_POST_CHAR);
            }
        }
        return randomFormatted.toString();
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值