C# Guid長度雪花簡單生成器的示例代碼
標(biāo)準(zhǔn)的long雪花長度為64bit,還要浪費1bit,然后41位時間,10位workid,12位序列
guid長度128位,64位完整的時間tick,32位workid,32位序列,可謂隨便用滿非常豪華
也就是系統(tǒng)里可以根據(jù)需要有的地方存隨機(jī)guid,有的地方存雪花guid,隨便換
隨后還有提取時間的方法,由于是64位完整時間,直接拿出來轉(zhuǎn)時間就好了
這個類參考別人的代碼,如果需要設(shè)計更完善的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長度雪花簡單生成器的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于c# guid雪花生成器的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C# 中使用Stopwatch計時器實現(xiàn)暫停計時繼續(xù)計時功能
這篇文章主要介紹了C# 中使用Stopwatch計時器可暫停計時繼續(xù)計時,主要介紹stopwatch的實例代碼詳解,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03C#使用Newtonsoft.Json中的JObject對象
本文詳細(xì)講解了C#使用Newtonsoft.Json中JObject對象的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07C#使用SqlConnection連接到SQL Server的代碼示例
這篇文章主要介紹了C#使用SqlConnection連接到SQL Server的代碼示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03

c# 動態(tài)加載dll文件,并實現(xiàn)調(diào)用其中的簡單方法

winform創(chuàng)建不規(guī)則窗體的方法

C#中標(biāo)準(zhǔn)的IDispose模式代碼詳解