欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# Guid長度雪花簡單生成器的示例代碼

 更新時間:2020年12月21日 09:40:20   作者:eflay  
這篇文章主要介紹了C# Guid長度雪花簡單生成器的示例代碼,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下

標(biāo)準(zhǔn)的long雪花長度為64bit,還要浪費1bit,然后41位時間,10位workid,12位序列

guid長度128位,64位完整的時間tick,32位workid,32位序列,可謂隨便用滿非常豪華

也就是系統(tǒng)里可以根據(jù)需要有的地方存隨機(jī)guid,有的地方存雪花guid,隨便換

隨后還有提取時間的方法,由于是64位完整時間,直接拿出來轉(zhuǎn)時間就好了

這個類參考別人的代碼,如果需要設(shè)計更完善的guid雪花,可以在github上或者nuget上找newid這個項目,老外寫好的更完善的做法

public class GuidSnowFlakeGenerator
 {
  readonly uint _c;
  int _a;
  int _b;
  long _lastTick;
  uint _sequence;

  SpinLock _spinLock;

  public GuidSnowFlakeGenerator(uint workId)
  {
   _spinLock = new SpinLock(false);
   _c = workId;
  }

  public Guid Next()
  {
   var ticks = DateTime.UtcNow.Ticks;

   int a;
   int b;
   uint sequence;

   var lockTaken = false;
   try
   {
    _spinLock.Enter(ref lockTaken);

    if (ticks > _lastTick)
     UpdateTimestamp(ticks);
    else if (_sequence == uint.MaxValue)
     UpdateTimestamp(_lastTick + 1);

    sequence = _sequence++;

    a = _a;
    b = _b;
   }
   finally
   {
    if (lockTaken)
     _spinLock.Exit();
   }

   var s = sequence;
   byte[] bytes = new byte[16];
   bytes[0] = (byte)(a >> 24);
   bytes[1] = (byte)(a >> 16);
   bytes[2] = (byte)(a >> 8);
   bytes[3] = (byte)a;
   bytes[4] = (byte)(b >> 24);
   bytes[5] = (byte)(b >> 16);
   bytes[6] = (byte)(b >> 8);
   bytes[7] = (byte)b;
   bytes[8] = (byte)(_c >> 24);
   bytes[9] = (byte)(_c >> 16);
   bytes[10] = (byte)(_c >> 8);
   bytes[11] = (byte)(_c);
   bytes[12] = (byte)(s >> 24);
   bytes[13] = (byte)(s >> 16);
   bytes[14] = (byte)(s >> 8);
   bytes[15] = (byte)(s >> 0);

   return new Guid(bytes);
  }


  void UpdateTimestamp(long tick)
  {
   _b = (int)(tick & 0xFFFFFFFF);
   _a = (int)(tick >> 32);

   _sequence = 0;
   _lastTick = tick;
  }

  public static DateTime GetTime(Guid guid)
  {
   var bytes = guid.ToByteArray();
   long tick = (long)bytes[0] << 56;
   tick += (long)bytes[1] << 48;
   tick += (long)bytes[2] << 40;
   tick += (long)bytes[3] << 32;
   tick += (long)bytes[3] << 24;
   tick += (long)bytes[3] << 16;
   tick += (long)bytes[3] << 8;
   tick += (long)bytes[3];
   return new DateTime(tick, DateTimeKind.Utc);
  }
 }

以上就是C# Guid長度雪花簡單生成器的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于c# guid雪花生成器的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c# 動態(tài)加載dll文件,并實現(xiàn)調(diào)用其中的簡單方法

    c# 動態(tài)加載dll文件,并實現(xiàn)調(diào)用其中的簡單方法

    下面小編就為大家?guī)硪黄猚# 動態(tài)加載dll文件,并實現(xiàn)調(diào)用其中的簡單方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • winform創(chuàng)建不規(guī)則窗體的方法

    winform創(chuàng)建不規(guī)則窗體的方法

    這篇文章主要介紹了winform創(chuàng)建不規(guī)則窗體的方法,涉及C#窗體創(chuàng)建的相關(guān)參數(shù)設(shè)置技巧,非常具有實用價值,需要的朋友可以參考下
    2015-09-09
  • C#中標(biāo)準(zhǔn)的IDispose模式代碼詳解

    C#中標(biāo)準(zhǔn)的IDispose模式代碼詳解

    在本篇文章中小編給大家分享的是關(guān)于C#中標(biāo)準(zhǔn)的IDispose模式的實例用法相關(guān)內(nèi)容,有需要的朋友們測試下。
    2019-09-09
  • 使用NOPI讀取Word、Excel文檔內(nèi)容

    使用NOPI讀取Word、Excel文檔內(nèi)容

    這篇文章主要為大家詳細(xì)介紹了使用NOPI讀取Word、Excel文檔內(nèi)容的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • C#如何綁定多個按鈕到同一個事件

    C#如何綁定多個按鈕到同一個事件

    這篇文章主要介紹了C#如何綁定多個按鈕到同一個事件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 最新評論