C# Guid长度雪花简单生成器的示例代码
标准的long雪花长度为64bit,还要浪费1bit,然后41位时间,10位workid,12位序列
guid长度128位,64位完整的时间tick,32位workid,32位序列,可谓随便用满非常豪华
也就是系统里可以根据需要有的地方存随机guid,有的地方存雪花guid,随便换
随后还有提取时间的方法,由于是64位完整时间,直接拿出来转时间就好了
这个类参考别人的代码,如果需要设计更完善的guid雪花,可以在github上或者nuget上找newid这个项目,老外写好的更完善的做法
publicclassGuidSnowFlakeGenerator { readonlyuint_c; int_a; int_b; long_lastTick; uint_sequence; SpinLock_spinLock; publicGuidSnowFlakeGenerator(uintworkId) { _spinLock=newSpinLock(false); _c=workId; } publicGuidNext() { varticks=DateTime.UtcNow.Ticks; inta; intb; uintsequence; varlockTaken=false; try { _spinLock.Enter(reflockTaken); if(ticks>_lastTick) UpdateTimestamp(ticks); elseif(_sequence==uint.MaxValue) UpdateTimestamp(_lastTick+1); sequence=_sequence++; a=_a; b=_b; } finally { if(lockTaken) _spinLock.Exit(); } vars=sequence; byte[]bytes=newbyte[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); returnnewGuid(bytes); } voidUpdateTimestamp(longtick) { _b=(int)(tick&0xFFFFFFFF); _a=(int)(tick>>32); _sequence=0; _lastTick=tick; } publicstaticDateTimeGetTime(Guidguid) { varbytes=guid.ToByteArray(); longtick=(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]; returnnewDateTime(tick,DateTimeKind.Utc); } }
以上就是C#Guid长度雪花简单生成器的示例代码的详细内容,更多关于c#guid雪花生成器的资料请关注毛票票其它相关文章!