这篇文章主要介绍了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# Guid长度雪花简单生成器的示例代码


猜你喜欢
- C语言手把手带你掌握带头双向循环链表 2023-04-03
- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
- Easyx实现扫雷游戏 2023-02-06
- C语言详解float类型在内存中的存储方式 2023-03-27
- C语言qsort()函数的使用方法详解 2023-04-26
- C++ 数据结构超详细讲解顺序表 2023-03-25
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
- ubuntu下C/C++获取剩余内存 2023-09-18
- Qt计时器使用方法详解 2023-05-30