C# Guid长度雪花简单生成器的示例代码

 更新时间:2020年12月21日 09:40:20   作者:eflay  
这篇文章主要介绍了C# Guid长度雪花简单生成器的示例代码,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下

标准的long雪花长度为64bit,还要浪费1bit,然后41位时间,10位workid,12位序列

guid长度128位,64位完整的时间tick,32位workid,32位序列,可谓随便用满非常豪华

也就是系统里可以根据需要有的地方存随机guid,有的地方存雪花guid,随便换

随后还有提取时间的方法,由于是64位完整时间,直接拿出来转时间就好了

这个类参考别人的代码,如果需要设计更完善的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长度雪花简单生成器的示例代码的详细内容,更多关于c# guid雪花生成器的资料请关注脚本之家其它相关文章!

相关文章

  • c# 日历控件的实现

    c# 日历控件的实现

    这篇文章主要介绍了c# 实现日历的示例代码,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-12-12
  • C#使用timer实现的简单闹钟程序

    C#使用timer实现的简单闹钟程序

    这篇文章主要介绍了C#使用timer实现的简单闹钟程序,涉及timer控件的使用及音频文件的操作技巧,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • Unity接入百度AI实现货币识别

    Unity接入百度AI实现货币识别

    本文主要介绍了在Unity中接入百度AI,从而实现货币识别,可以返回货币的名称、代码、面值、年份信息等,感兴趣的可以跟随小编学习一下
    2022-01-01
  • C# BackgroundWorker使用教程

    C# BackgroundWorker使用教程

    这篇文章主要为大家详细介绍了C# BackgroundWorker使用教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • C# 正则表达式常用的符号和模式解析(最新推荐)

    C# 正则表达式常用的符号和模式解析(最新推荐)

    这篇文章主要介绍了C# 正则表达式常用的符号和模式解析,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • 轻松学习C#的抽象类

    轻松学习C#的抽象类

    轻松学习C#的抽象类,对C#的抽象类感兴趣的朋友可以参考本篇文章,帮助大家更灵活的运用C#的抽象类
    2015-11-11
  • 如何用C#在PC上查找连接蓝牙设备并实现数据传输

    如何用C#在PC上查找连接蓝牙设备并实现数据传输

    这篇文章主要介绍了如何用C#在PC上查找连接蓝牙设备并实现数据传输,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-03-03
  • C# App.config和Web.config加密的实现步骤

    C# App.config和Web.config加密的实现步骤

    本文介绍了如何使用C#对App.config和Web.config文件进行加密,通过使用ConfigurationSection类和SymmetricAlgorithm类,我们可以保护配置文件中的敏感数据,确保只有授权人员可以访问
    2023-08-08
  • C# WinForm实现自动更新程序的方法详解

    C# WinForm实现自动更新程序的方法详解

    这一篇就着重写一下客户端的代码,客户端主要实现的有:启动后检测本地的xml文件,然后发送到服务器获取需要更新的文件以及版本列表,感兴趣的小伙伴可以了解一下
    2022-10-10
  • c#使用Socket发送HTTP/HTTPS请求的实现代码

    c#使用Socket发送HTTP/HTTPS请求的实现代码

    这篇文章主要介绍了c#使用Socket发送HTTP/HTTPS请求的实现代码,需要的朋友可以参考下
    2017-09-09

最新评论