祁凡 2021-05-20 16:24 采纳率: 50%
浏览 442
已采纳

急!!!唯一ID 时间戳+6位随机数在程序里跑的时候出现key重复

在测试库的数据有100w左右,用的唯一ID 时间戳+6位随机数作为ID来使用的,在跑程序的时候时不时就会报key重复,毫秒容易重复还可以,六位随机数重复的可能是十万分之一,而且我也不可能一毫米就跑十万条数据呀,他为啥就这么容易重复呢。

  • 写回答

3条回答 默认 最新

  • 小P聊技术 2021-05-20 16:26
    关注

    建议你换一种全局ID的生成方法, 建议使用推特雪花算法的 全局唯一ID

    package org.n3r.idworker;
    
    import org.n3r.idworker.strategy.DefaultWorkerIdStrategy;
    import org.n3r.idworker.utils.Utils;
    import org.springframework.stereotype.Component;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    @Component
    public class Sid {
        private static WorkerIdStrategy workerIdStrategy;
        private static IdWorker idWorker;
    
        static {
            configure(DefaultWorkerIdStrategy.instance);
        }
    
    
        public static synchronized void configure(WorkerIdStrategy custom) {
            if (workerIdStrategy != null) workerIdStrategy.release();
            workerIdStrategy = custom;
            idWorker = new IdWorker(workerIdStrategy.availableWorkerId()) {
                @Override
                public long getEpoch() {
                    return Utils.midnightMillis();
                }
            };
        }
    
        /**
         * 一天最大毫秒86400000,最大占用27比特
         * 27+10+11=48位 最大值281474976710655(15字),YK0XXHZ827(10字)
         * 6位(YYMMDD)+15位,共21位
         *
         * @return 固定21位数字字符串
         */
    
        public static String next() {
            long id = idWorker.nextId();
            String yyMMdd = new SimpleDateFormat("yyyyMMdd").format(new Date());
            return yyMMdd + String.format("%014d", id);
        }
    
    
        /**
         * 返回固定16位的字母数字混编的字符串。
         */
        public String nextShort() {
            long id = idWorker.nextId();
            String yyMMdd = new SimpleDateFormat("yyyyMMdd").format(new Date());
            return yyMMdd + Utils.padLeft(Utils.encode(id), 10, '0');
        }
    
    //    public static void main(String[] args) {
    //		String aa = new Sid().nextShort();
    //		String bb = new Sid().next();
    //
    //		System.out.println(aa);
    //		System.out.println(bb);
    //	}
    
        public static void main(String[] args) {
            Sid sid = new Sid();
            System.out.println(sid.nextShort());
        }
    }
    

    代码我这边比较多,如果你需要的话,我可以单独发你代码

     

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算