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

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

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

      Snowflake算法生成Id

      網(wǎng)上大部分C#寫的都有點(diǎn)亂糟糟,我簡化了一下。這個(gè)算法總體思想是生成一個(gè)64位整數(shù),前42位放從前某特定時(shí)間點(diǎn)到當(dāng)前時(shí)間的毫秒數(shù),中間10位放生成id的機(jī)器的唯一編碼,后12位放順序號(hào)(如果同一毫秒內(nèi)生成多次,此順序號(hào)可避免產(chǎn)生重復(fù)id)

      using System;
      
      namespace xxx
      {
          /// <summary>
          /// Id 生成類
          /// </summary>
          class Snowflake
          {
              private const string LOCK_OBJ = "76003AEB-E3F9-460A-BD31-D9AE9E7684C0";
      
              private const int MACHINE_BIT_SIZE = 10; // 機(jī)器編號(hào)長度10位
              private const int SEQUENCE_BIT_SIZE = 12; // 序號(hào)長度12位
      
              private static Snowflake _snowflake;
      
              private long _machineNumber; // 機(jī)器序號(hào)
              private long _timestamp; // 時(shí)間戳
              private long _sequence; // 序號(hào)
      
              private Snowflake() { }
      
              /// <summary>
              /// 設(shè)置機(jī)器序號(hào)
              /// </summary>
              public int MachineNumber
              {
                  set { _machineNumber = value; }
              }
      
              /// <summary>
              /// 得到一個(gè)實(shí)例
              /// </summary>
              /// <returns></returns>
              public static Snowflake GetInstance()
              {
                  if (_snowflake == null)
                  {
                      lock (LOCK_OBJ)
                      {
                          if (_snowflake == null)
                          {
                              _snowflake = new Snowflake();
                          }
                      }
                  }
                  return _snowflake;
              }
      
              /// <summary>
              /// 產(chǎn)生一個(gè)id,由時(shí)間戳、機(jī)器編碼、順序號(hào)組成
              /// </summary>
              /// <returns></returns>
              public long GenerateId(Func<DateTime> GetTime)
              {
                  lock (LOCK_OBJ)
                  {
                      if (_machineNumber > (-1L ^ -1L << MACHINE_BIT_SIZE))
                      {
                          throw new ArgumentException("機(jī)器編號(hào)超出最大值");
                      }
      
                      long timestamp = GetTimestamp(GetTime());
                      if (timestamp < _timestamp)
                      {
                          throw new ArgumentException("時(shí)間戳錯(cuò)誤");
                      }
      
                      if (timestamp == _timestamp)
                      {
                          _sequence++;
                          if (_sequence > (-1L ^ -1L << SEQUENCE_BIT_SIZE))
                          {
                              while (true) // 序號(hào)已用完,等下一毫秒
                              {
                                  timestamp = GetTimestamp(GetTime());
                                  if (timestamp > _timestamp)
                                  {
                                      _sequence = 0;
                                      break;
                                  }
                              }
                          }
                      }
                      else
                      {
                          _sequence = 0;
                      }
      
                      long id = timestamp << (MACHINE_BIT_SIZE + SEQUENCE_BIT_SIZE) 
                          | _machineNumber << SEQUENCE_BIT_SIZE 
                          | _sequence;
      
                      _timestamp = timestamp;
      
                      return id;
                  }
              }
      
              // 當(dāng)前時(shí)間戳
              private long GetTimestamp(DateTime now)
              {
                  return (long)(now - new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
              }
          }
      }
      

      調(diào)用:

      using System;
      
      namespace xxx
      {
          public class IdGenerator
          {
              /// <summary>
              /// 生成Id
              /// </summary>
              /// <returns></returns>
              public static long GenerateId()
              {
                  Snowflake sf = Snowflake.GetInstance();
                  sf.MachineNumber = YourGetMachineNumberFunction();
                  long id = sf.GenerateId(GetTime);
                  return id;
              }
      
              private static DateTime GetTime()
              {
                  return YourGetNowTimeFunction();
              }
          }
      }
      
      posted @ 2024-01-15 20:12  會(huì)長  閱讀(66)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 亚洲熟妇自偷自拍另欧美| 国产精品国产亚洲区久久| 亚洲国产成人资源在线| 国产三级a三级三级| 无码中文av波多野结衣一区 | 国产精品污双胞胎在线观看| 综合偷自拍亚洲乱中文字幕| 国产精品疯狂输出jk草莓视频| 99在线精品免费视频九九视| 鹤壁市| 亚洲精品乱码久久久久久蜜桃图片| 国产精品中文字幕第一区| 亚洲国产综合自在线另类| 欧美成人h精品网站| 亚洲综合精品一区二区三区| A毛片终身免费观看网站| 台湾省| 国产亚洲精品一区二区不卡 | 成人午夜在线观看日韩| 成人午夜在线观看日韩| 久热色精品在线观看视频| 色777狠狠狠综合| 久久天天躁狠狠躁夜夜婷| 日本三线免费视频观看| 国产成人一区二区不卡| 午夜片神马影院福利| 国产精品福利自产拍久久| 国产成人精品视频不卡| 石林| 农村老熟妇乱子伦视频| 欧美人与动欧交视频| 亚洲国产日韩一区三区| 久久久久无码中| 日本精品中文字幕在线不卡| 国产精品亚洲二区亚瑟| 高清无打码一区二区三区| 最新亚洲国产手机在线| 国产不卡一区二区在线| 一区二区三区日本久久九| 免费久久人人爽人人爽AV| 色综合天天综合天天综|