Java做到16位随机码变化转载

原创
小哥 3年前 (2022-10-27) 阅读数 50 #大杂烩

在实际工程中遇到了需要生成的唯一的非重复项。16位随机码问题,随机码还需要包含数字和大小写的英文字母。16比特,以确保全局唯一随机码更弱32如果使用机器代码,则返回bit方法。+时间戳+在随机码方面,数字的数量已经捉襟见肘。如果位数不够,它只能依靠随机生成的方法来使产品可用。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
资料来源:简讯
版权归作者所有。请联系作者以获得商业转载的授权,并注明非商业转载的来源。

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门