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

标准的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雪花生成器的资料请关注我们其它相关文章!

(0)

相关推荐

  • c# 如何实现代码生成器

    做了2,3年的java-web,始终木有逃离所谓基础业务,增删改查这些一成不变的东西写起来浪费大量时间,于是做了个简单的代码生成器快速生成 代码生成器的原理其实很简单,都是基于模板实现替换,模板基于是Nvelocity. 部分代码展示:[目前只支持mysql .oracle.sqlite 三种数据库的连接 有需要 可以自己增加] sing System; using System.Collections.Generic; using System.Data; using System.Linq;

  • asp.net(c#)网页跳转七种方法小结

    ①response.redirect 这个跳转页面的方法跳转的速度不快,因为它要走2个来回(2次postback),但他可以跳 转到任何页面,没有站点页面限制(即可以由雅虎跳到新浪),同时不能跳过登录保护.但速度慢是其最大缺陷!redirect跳转机制:首先是发送一个http请求到客户端,通知需要跳转到新页面,然后客户端在发送跳转请求到服务器端.需要注意的是跳转后内部空间保存的所有数据信息将会丢失,所以需要用到session. 实例 Example that uses Redirect [C#;

  • C#几种截取字符串的方法小结

    1.根据单个分隔字符用split截取 例如 复制代码 代码如下: string st="GT123_1"; string[] sArray=st.split("_"); 即可得到sArray[0]="GT123",sArray[1]="1"; 2.利用多个字符来分隔字符串 例如 复制代码 代码如下: string str = "GTAZB_JiangjBen_123";string[] sArray = s

  • C# DataGridView添加新行的2个方法

    可以静态绑定数据源,这样就自动为DataGridView控件添加 相应的行.假如需要动态为DataGridView控件添加新行,方法有很多种,下面简单介绍如何为DataGridView控件动态添加新行的两种方 法: 方法一: 复制代码 代码如下: int index=this.dataGridView1.Rows.Add();this.dataGridView1.Rows[index].Cells[0].Value = "1"; this.dataGridView1.Rows[inde

  • C#设计模式之Builder生成器模式解决带老婆配置电脑问题实例

    本文实例讲述了C#设计模式之Builder生成器模式解决带老婆配置电脑问题.分享给大家供大家参考,具体如下: 一.理论定义 生成器模式 又叫:建造者模式,它  可以 把一个 复杂的对象,分步骤创建. 二.应用举例 需求描述:话说发工资了,打算去岗顶百脑汇  给老婆配置一台电脑. OK,坐着BRT,就出发了. 到岗顶,一美女扑面而来,面带微笑:先生,请问看中那个品牌,过来看一下嘛! 人家都开口了,盛情难却,就看下吧. 三.具体编码 1.CPU using System; using System.

  • 详解C#设计模式编程中生成器模式的使用

    一.概述 在软件系统中,有时候面临着复杂的对象创建,该对象由一定算法构成的子对象组成,由于需求变化,这些子对象会经常变换,但组合在一起的算法却是稳定的.生成器模式可以处理这类对象的构建,它提供了一种封装机制来隔离各类子对象的变化,从而保证系统的稳定. 二.生成器模式 生成器模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.其结构图如下: Builder为创建Product对象的各个子对象指定抽象接口. ConcreteBuilder实现了Builder接口,用于创建P

  • c#的dllimport使用方法详解

    DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出的函数的必要调用信息 DllImport属性应用于方法,要求最少要提供包含入口点的dll的名称.DllImport的定义如下: 复制代码 代码如下: [AttributeUsage(AttributeTargets.Method)]public class DllImportAttribute: System.Attribute{public DllImportA

  • C#连接MySql数据库的方法

    1.要连接MySql数据库必须首先下载MySql官方的连接.net的文件,文件下载地址为http://dev.mysql.com/downloads/connector/net/6.6.html#downloads ,下载平台选择.Net&Mono,下载ZIP免安装版.2.解压缩刚才下载的mysql-connector-net-6.6.6-noinstall.zip文件,里面有几个版本选择,在这里我选V4, 选中这几个文件,然后添加到C#项目的引用中,然后就可以编写程序进行数据库的操作了. 3.

  • C#中List〈string〉和string[]数组之间的相互转换

    1,从System.String[]转到List<System.String> System.String[] str={"str","string","abc"}; List<System.String> listS=new List<System.String>(str); 2, 从List<System.String>转到System.String[] List<System.Strin

  • C#中使用split分割字符串的几种方法小结

    第一种方法: 复制代码 代码如下: string s=abcdeabcdeabcde;string[] sArray=s.Split(c) ;foreach(string i in sArray)Console.WriteLine(i.ToString()); 输出下面的结果:abdeabdeabde 第二种方法: 我们看到了结果是以一个指定的字符进行的分割.使用另一种构造方法对多个字符进行分割: 复制代码 代码如下: string s=abcdeabcdeabcdestring[] sArra

随机推荐