您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    了解Snowflake算法的完成原理(9)
    时间:2020-08-10 21:30 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

            String value = HIGH + timestampString + workerIdString + dataCenterIdString + seqString; 

            return Long.parseLong(value, 2); 

        } 

     

        private long untilNextMillis(long lastTimestamp) { 

            long timestamp

            do { 

                timestamp = System.currentTimeMillis(); 

            } while (timestamp <= lastTimestamp); 

            return timestamp

        } 

     

        private static String leftPadding(String value, int maxLength) { 

            int diff = maxLength - value.length(); 

            StringBuilder builder = new StringBuilder(); 

            for (int i = 0; i < diff; i++) { 

                builder.append("0"); 

            } 

            builder.append(value); 

            return builder.toString(); 

        } 

     

        public static void main(String[] args) { 

            long epoch = LocalDateTime.of(1970, 1, 1, 0, 0, 0, 0) 

                    .toInstant(ZoneOffset.of("+8")).toEpochMilli(); 

            PrimaryKeyGenerator generator = new SimpleSnowflake(1L, 1L, epoch); 

            for (int i = 0; i < 5; i++) { 

                System.out.println(String.format("第%s个生成的ID: %d", i + 1, generator.generate())); 

            } 

        } 

     

    // 某个时辰输入如下 

    第1个生成的ID: 6698247966366502912 

    第2个生成的ID: 6698248027448152064 

    第3个生成的ID: 6698248032162549760 

    第4个生成的ID: 6698248033076908032 

    第5个生成的ID: 6698248033827688448 

    经过字符串拼接的写法虽然运转效率低,但是可读性会比较高,工程化处置后的代码可以在实例化时分直接指定 Worker ID 和 Data Center ID 等值,并且这个简易的 Snowflake 完成没有第三方库依赖,拷贝上去可以直接运转。下面的办法运用字符串拼接看起来比较低端,其实最后那部分的按位或, 可以完全转化为加法 :

    public class Main { 

         

        /** 

         * 2020-08-01 00:00:00 

         */ 

        private static final long EPOCH = 1596211200000L; 

     

        public static void main(String[] args) { 

            long workerId = 1L; 

            long dataCenterId = 1L; 

            long seq = 4095; 

            long timestampDiff = System.currentTimeMillis() - EPOCH; 

    (责任编辑:admin)