Java 随机生成 “纯数字“、“纯字母“ 、“数字字母混合“ ID 并保持全局唯一

随机生成 “纯数字”、“纯字母” 、“数字字母混合” ID并保持全局唯一
一、随机生成纯数字ID

	/**
     * 随机生成字符,只有数字
     * @param length  id长度
     */
    public static String getNumber(Integer length) {
        String uid = "";
        for (Integer i = 0; i < length; i++) {
            String randChar = String.valueOf(Math.round(Math.random() * 9));
            uid = uid.concat(randChar);
        }
        return uid;
    }
    
二、随机生成纯字母ID

    /**
    * 随机生成字符,只有大写字母
    * @param length  id长度
    */
	public static String getUppercaseLetter(Integer length) {
	    String uid = "";
	    for (Integer i = 0; i < length; i++) {
	        String randChar = String.valueOf((char) Math.round(Math.random() * 25 + 65));
	        uid = uid.concat(randChar);
	    }
	    return uid;
	}
	
	/**
     * 随机生成字符,只有小写字母
     * @param length  id长度
     */
    public static String getLowercaseLetter(Integer length) {
        String uid = "";
        for (Integer i = 0; i < length; i++) {
            String randChar = String.valueOf((char) Math.round(Math.random() * 25 + 65));
            uid = uid.concat(randChar);
        }
        return uid;
    }
	
三、随机生成数字字母混合 ID

	/**
     * 随机生成字符,含大写、数字
     * @param length  id长度
     */
    public static String getUppercaseLetterAndNumber(Integer length) {
        String uid = "";
        for (Integer i = 0; i < length; i++) {
            int index = (int) Math.round(Math.random() * 1);
            String randChar = "";
            switch (index) {
                case 0:
                    //大写字符
                    randChar = String.valueOf((char) Math.round(Math.random() * 25 + 65));
                    break;
                default:
                    //数字
                    randChar = String.valueOf(Math.round(Math.random() * 9));
                    break;
            }
            uid = uid.concat(randChar);
        }
        return uid;
    }

	

	/**
     * 随机生成字符,含大写、小写、数字
     * @param length  id长度
     */
    public static String getLowercaseAndUppercaseLettersAndNumber(Integer length) {
        String uid = "";
        for (Integer i = 0; i < length; i++) {
            int index = (int) Math.round(Math.random() * 2);
            String randChar = "";
            switch (index) {
                case 0:
                    //大写字符
                    randChar = String.valueOf((char) Math.round(Math.random() * 25 + 65));
                    break;
                case 1:
                    //小写字符
                    randChar = String.valueOf((char) Math.round(Math.random() * 25 + 97));
                    break;
                default:
                    //数字
                    randChar = String.valueOf(Math.round(Math.random() * 9));
                    break;
            }
            uid = uid.concat(randChar);
        }
        return uid;
    }
四、如何保持全局唯一 ?

思路:利用 redis 中间件,把出现过的 id 放进 redis 的 set 集合里面,每一次生成都需要从 redis 的集合里面判断一次,如存在则重新生成。

缺点:存在性能问题,尤其是批量获取的时候,需要重复去 redis 里面判断这个id 是否存在,解决方案看下。

五、如何批量获取并不会出现性能问题 ?

思路:设计一个存放 id 的池子,比如服务启动的预置 xxx 个,并定时查询池子的 id 数量是否低于 水平线,低于则补充。如果取的时候发现池子里的 id 数量不够的话,则返回提示,这个时候只有补充到充足的数量才能获取。需要设计两个池子,一个是放使用过的 id ,一个方未使用的 id 。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不像程序猿的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值