【Java 随机数】生成指定长度的随机数/随机字符工具(单例模式-双重检验锁)

194 阅读1分钟

代码片段日常记录分享,直接上代码。

import java.security.SecureRandom;

/**
 * 生成指定长度的随机数/随机字符工具(单例模式-双重检验锁)
 */
public class GenRandomUtil {

    private static volatile GenRandomUtil instance = null;

    private GenRandomUtil(){}

    public static GenRandomUtil getInstance() {
        if (instance == null) {
            synchronized(GenRandomUtil.class) {
                if (instance == null) {
                    instance = new GenRandomUtil();
                }
            }
        }
        return instance;
    }

    /**
     * 字母
     */
    private static final String RANDOM_CHAR = "char";

    /**
     * 数字
     */
    private static final String RANDOM_NUM = "num";

    /**
     * 生成随机验证码
     *
     * @param length 长度
     * @return 随机验证码(提货码)
     */
    public String generatePickupCode(int length) {

        StringBuilder code = new StringBuilder();
        SecureRandom random = new SecureRandom();
        // length为几位密码
        for (int i = 0; i < length; i++) {
            String charOrNum = random.nextInt(2) % 2 == 0 ? RANDOM_CHAR : RANDOM_NUM;
            // 输出字母还是数字
            if (RANDOM_CHAR.equalsIgnoreCase(charOrNum)) {
                // 输出是大写字母还是小写字母
                int temp = random.nextInt(2) % 2 == 0 ? 65 : 97;
                code.append((char) (random.nextInt(26) + temp));
            } else {
                code.append(String.valueOf(random.nextInt(10)));
            }
        }
        //应产品要求随机字母全小写
        return code.toString().toLowerCase();
    }

    public static void main(String[] args) {
        System.out.println(GenRandomUtil.getInstance().generatePickupCode(10));
    }

}