随机密码生成,一定包含大小写

本来是个很简单的事儿,一堆水文章的,实在看不下去了。

public class RandomUtil {
    public static final Random RANDOM = new Random();
    public static final String UPPER_CHAR = "QWERTYUIOPASDFGHJKLZXCVBNM";
    public static final String LOWER_CHAR = "qwertyuiopasdfghjklzxcvbnm";
    public static final String DIGITAL_CHAR = "0123456789";


    public static String randomPassword(int minLength, int maxLength) {
        // random length
        int len = RANDOM.nextInt(maxLength - minLength) + minLength;
        char[] chars = new char[len];
        // pools
        int[] boundPool = {26, 26, 10};
        List<Boolean> flagPool = Arrays.asList(false, false, false);
        String[] charPool = {UPPER_CHAR, LOWER_CHAR, DIGITAL_CHAR};

        BiConsumer<Integer, Integer> consumer = (i, index) -> {
            chars[i] = charPool[index].charAt(RANDOM.nextInt(boundPool[index]));
            flagPool.set(index, true);
        };
        for (int i = 0; i < len; i++) {
        	// 防止最后没有包含所有字符类型
            if (i >= len - 2 && flagPool.contains(false)) {
                consumer.accept(i, flagPool.indexOf(false));
            } else {
                consumer.accept(i, RANDOM.nextInt(3));
            }
        }
        return new String(chars);
    }

    public static void main(String[] args) {
        System.out.println(randomPassword(8, 12));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值