这篇文章主要介绍了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++类和对象到底是什么 2022-11-12
- C++高级数据结构之并查集 2023-04-20
- C语言实现简易停车场管理系统 2023-03-13
- C/C++ Qt StatusBar底部状态栏应用教程 2023-01-10
- 使用VS2022开发在线远程编译部署的C++程序(图文详解) 2023-01-15
- C语言预编译#define(预处理) 2023-04-03
- 如何告诉 MinGW 链接器不要导出所有符号? 2022-10-07
- C语言文件操作与相关函数介绍 2023-06-13
- 使用C/C++读写.mat文件的方法详解 2023-03-05
- 漫画讲解C语言中最近公共祖先的三种类型 2023-01-01