服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C# Guid长度雪花简单生成器的示例代码

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

2022-10-24 12:09eflay C#

这篇文章主要介绍了C# Guid长度雪花简单生成器的示例代码,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下

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

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

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

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

这个类参考别人的代码,如果需要设计更完善的guid雪花,可以在github上或者nuget上找newid这个项目,老外写好的更完善的做法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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雪花生成器的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/gxrsprite/p/14003815.html

延伸 · 阅读

精彩推荐
  • C#unity实现按住鼠标选取区域截图

    unity实现按住鼠标选取区域截图

    这篇文章主要为大家详细介绍了unity实现按住鼠标选取区域截图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    LixiSchool10462022-09-02
  • C#C# 实现FTP客户端的小例子

    C# 实现FTP客户端的小例子

    这篇文章主要介绍了C# 如何实现FTP客户端,文中实例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...

    Alan.hsiang11062022-09-23
  • C#C#微信开发之接收 / 返回文本消息

    C#微信开发之接收 / 返回文本消息

    本文主要介绍了C#微信开发之接收 / 返回文本消息原理与实现方法,具有一定的参考价值,下面跟着小编一起来看下吧...

    likar11222021-12-22
  • C#C#中的虚方法和抽象方法的运用

    C#中的虚方法和抽象方法的运用

    这篇文章主要介绍了C#中的虚方法和抽象方法的运用,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...

    微笑在嘴边7192022-09-28
  • C#C# 类的声明详解

    C# 类的声明详解

    本文主要对C# 类的声明进行详细介绍。具有一定的参考价值,下面跟着小编一起来看下吧...

    liyongke7832021-12-20
  • C#c# 通过WinAPI播放PCM声音

    c# 通过WinAPI播放PCM声音

    这篇文章主要介绍了c# 通过WinAPI播放PCM声音的方法,帮助大家更好的理解和使用c#编程语言,感兴趣的朋友可以了解下...

    天方11452022-10-21
  • C#C#如何访问共享文件夹或者磁盘

    C#如何访问共享文件夹或者磁盘

    这篇文章主要为大家详细介绍了C#访问共享文件夹或者磁盘,需要用户名密码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    边界流浪者7552022-02-24
  • C#C#编写控制台程序纸牌游戏

    C#编写控制台程序纸牌游戏

    这篇文章主要为大家详细介绍了C#编写控制台程序纸牌游戏,适合C#初学者,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    qq_241116319182022-08-03