Java实现16位随机码生成

在实际项目中碰到一个需要生成唯一不重复的16位随机码问题,该随机码还需要包含数字和大小写的英文字母,对于16位来确保全局唯一的随机码来说是弱于32位方法的,如果采用机器码+时间戳+随机码来说位数已经捉襟见肘了,位数不够只能全依赖随机生成方法来做到一个生产可用的16位随机码,于是利用java中的SecureRandom强随机函数来实现取值逻辑,网上提到的生成随机数的方法主要有三种:

  • Math.random 随机数
  • java.util.Random 伪随机数(线性同余法生成)
  • java.security.SecureRandom 真随机数

随机数,采用的是类似于统计学的随机数生成规则,其输出结果很容易预测,因此可能导致被攻击者击中。而真随机数,采用的是类似于密码学的随机数生成规则,其输出结果较难预测,若想要预防被攻击者攻击,最好做到使攻击者根本无法,或不可能鉴别生成的随机值和真正的随机值。在商业上,能经得起生产工业使用的一般推荐第三种生成方法,此处也是采用强随机数进行16位随机码的实现:

/**
     * 生成16位不重复的随机数,含数字+大小写
     * @return
     */
    public static String getGUID() {
        StringBuilder uid = new StringBuilder();
        //产生16位的强随机数
        Random rd = new SecureRandom();
        for (int i = 0; i < 16; i++) {
            //产生0-2的3位随机数
            int type = rd.nextInt(3);
            switch (type){
                case 0:
                    //0-9的随机数
                    uid.append(rd.nextInt(10));
                    break;
                case 1:
                    //ASCII在65-90之间为大写,获取大写随机
                    uid.append((char)(rd.nextInt(25)+65));
                    break;
                case 2:
                    //ASCII在97-122之间为小写,获取小写随机
                    uid.append((char)(rd.nextInt(25)+97));
                    break;
                default:
                    break;
            }
        }
        return uid.toString();
    }

实际执行100条循环耗时大约6ms,每条执行大约0.06ms,效率可以保证在高并发环境下的使用,但是难以保证该随机数在海量数据的情况下强唯一性,可能会存在一定的碰撞几率,尽管这种几率并不是太大。

17人点赞

算法与设计模式

作者:YitaiCloud
链接:https://www.jianshu.com/p/7a64094a01ee
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


🐞标题:Java实现16位随机码生成
👽作者:ruige
🐾地址:https://jjdhhc.com/articles/2020/11/07/1604719884739.html
🙏感恩:谢谢您的打赏与支持!中间图片是我的微信公众号,扫码关注哦!
支付宝支付 微信公众号 微信支付