<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      雪花算法snowflakeIdWorker使用記錄

                 生成唯一的traceId時候是通過uuid進行生成的,想到有沒有什么更好的方法,網上搜索了下性能更好的雪花算法。參考:https://zhuanlan.zhihu.com/p/433690272

                 自己在使用時候主要是機器id的生成以及怎么避免重復,這個主要是通過ip地址以及hostName進行取余獲取。代碼如下:

               

      package com.gwm.lafeng.util;
      
      public class SnowflakeIdWorker {
      
          private Logger logger = LoggerFactory.getLogger(this.getClass());
          /**
           * 開始時間截 (2023-01-01)
           */
          private final long twepoch = 1672502400000L;
          /**
           * 機器id所占的位數
           */
          private final long workerIdBits = 5L;
          /**
           * 數據標識id所占的位數
           */
          private final long datacenterIdBits = 5L;
          /**
           * 支持的最大機器id,結果是31 (這個移位算法可以很快的計算出幾位二進制數所能表示的最大十進制數)
           */
          private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
          /**
           * 支持的最大數據標識id,結果是31
           */
          private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
          /**
           * 序列在id中占的位數
           */
          private final long sequenceBits = 12L;
          /**
           * 機器ID向左移12位
           */
          private final long workerIdShift = sequenceBits;
          /**
           * 數據標識id向左移17位(12+5)
           */
          private final long datacenterIdShift = sequenceBits + workerIdBits;
          /**
           * 時間截向左移22位(5+5+12)
           */
          private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
          /**
           * 生成序列的掩碼,這里為4095 (0b111111111111=0xfff=4095)
           */
          private final long sequenceMask = -1L ^ (-1L << sequenceBits);
          /**
           * 工作機器ID(0~31)
           */
          private long workerId;
          /**
           * 數據中心ID(0~31)
           */
          private long datacenterId;
          /**
           * 毫秒內序列(0~4095)
           */
          private long sequence = 0L;
          /**
           * 上次生成ID的時間截
           */
          private long lastTimestamp = -1L;
          /**
           * 構造函數
           * @param workerId     工作ID (0~31)
           * @param datacenterId 數據中心ID (0~31)
           */
          public SnowflakeIdWorker(long workerId, long datacenterId) {
              if (workerId > maxWorkerId || workerId < 0) {
                  throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
              }
              if (datacenterId > maxDatacenterId || datacenterId < 0) {
                  throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
              }
              try {
                    workerId = getHostId(Inet4Address.getLocalHost().getHostAddress(),31);
                    datacenterId = getHostId(SystemUtils.getHostName(),31);
              } catch (UnknownHostException e) {
                  logger.error("獲取異常",e);
                  workerId = RandomUtils.nextLong(0,31);
                  datacenterId = RandomUtils.nextLong(0,31) ;
              }
              logger.info("workerId:" + workerId +"datacenterId:" + datacenterId);
              this.workerId = workerId;
              this.datacenterId = datacenterId;
          }
          /**
           * 獲得下一個ID (該方法是線程安全的)
           * @return SnowflakeId
           */
          public synchronized long nextId() {
              long timestamp = timeGen();
              // 如果當前時間小于上一次ID生成的時間戳,說明系統時鐘回退過這個時候應當拋出異常
              if (timestamp < lastTimestamp) {
                  throw new RuntimeException(
                          String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
              }
              // 如果是同一時間生成的,則進行毫秒內序列
              if (lastTimestamp == timestamp) {
                  sequence = (sequence + 1) & sequenceMask;
                  // 毫秒內序列溢出
                  if (sequence == 0) {
                      //阻塞到下一個毫秒,獲得新的時間戳
                      timestamp = tilNextMillis(lastTimestamp);
                  }
              }
              // 時間戳改變,毫秒內序列重置
              else {
                  sequence = 0L;
              }
              // 上次生成ID的時間截
              lastTimestamp = timestamp;
              // 移位并通過或運算拼到一起組成64位的ID
              return ((timestamp - twepoch) << timestampLeftShift) //
                      | (datacenterId << datacenterIdShift) //
                      | (workerId << workerIdShift) //
                      | sequence;
          }
          /**
           * 阻塞到下一個毫秒,直到獲得新的時間戳
           * @param lastTimestamp 上次生成ID的時間截
           * @return 當前時間戳
           */
          protected long tilNextMillis(long lastTimestamp) {
              long timestamp = timeGen();
              while (timestamp <= lastTimestamp) {
                  timestamp = timeGen();
              }
              return timestamp;
          }
          /**
           * 返回以毫秒為單位的當前時間
           * @return 當前時間(毫秒)
           */
          protected long timeGen() {
              return System.currentTimeMillis();
          }
      
          /**
           * 根據機器ip以及機器host轉化為機器workId
           * @param s
           * @param max
           * @return
           */
          public static int getHostId(String s,int max){
              byte[] bytes = s.getBytes();
              int sums = 0;
              for(int b: bytes){
                  sums += b;
              }
              return sums % (max + 1);
          }
      
          /*public static void main(String[] args) throws Exception {
              int hostAddress = getHostId(Inet4Address.getLocalHost().getHostAddress(),31);
              int hostName = getHostId(SystemUtils.getHostName(),31);
              System.out.println(hostAddress +" : " +  hostName);
              SnowflakeIdWorker idWorker = new SnowflakeIdWorker(hostAddress, hostName);
              Long startNow = System.currentTimeMillis();
              for (int i = 0; i < 10000; i++) {
                  long id = idWorker.nextId();
              }
              Long endTime = System.currentTimeMillis();
              System.out.println("耗時:" + (endTime-startNow) + "毫秒");
          }*/
      }
      

        

      posted @ 2023-09-08 10:23  Doyourself!  閱讀(216)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 久久av高潮av无码av喷吹| 亚洲人成网站77777在线观看| 欧美猛少妇色xxxxx| 天堂av在线一区二区| 国产成人亚洲日韩欧美| 成人乱人乱一区二区三区| 龙岩市| 26uuu另类亚洲欧美日本| 国产对白老熟女正在播放| 亚洲欧美一区二区成人片| 色婷婷五月综合久久| 91亚洲国产成人久久精品| 成人午夜电影福利免费| 福利在线视频一区二区| 一区二区三区午夜无码视频 | 亚洲欧美日本久久网站| 国产a在亚洲线播放| 亚洲国产天堂久久综合226114| 欧美性xxxxx极品| 青青草国产线观看| 国产色无码专区在线观看| 国产成人卡2卡3卡4乱码| 久久精品国产福利一区二区| 国产乱妇无码大片在线观看| 欧美牲交a欧美牲交aⅴ图片| 亚洲鸥美日韩精品久久| 墨脱县| 国产成人一区二区三区视频免费| 精品免费看国产一区二区| 在线亚洲人成电影网站色www| 亚洲精品无码av天堂| 亚洲人成电影在线天堂色| 天天躁夜夜躁狠狠综合| 3d全彩无码啪啪本子全彩| 久久精品国产蜜臀av| 武山县| 国产成人高清亚洲综合| 亚洲AV天天做在线观看| 国产线播放免费人成视频播放| 成人特黄特色毛片免费看| 国产精品久久久久影院亚瑟|