簡介
這個是根據twitter的snowflake來寫的.這裡有中文的介紹.
如上圖所示,一個64位ID,除了最左邊的符號位不用固定為左邊符號位而以確保產生的ID都是正數),還剩餘63位可用.
下面的代碼與圖中的位數分配略有不同,除了中間部分10bit工作機器id不變,時間戳和序號的位數是可以根據自己的需求變化的,就是說,你可以把中間的工作機器ID往左挪一挪,或往右挪一挪.
代碼
/// <summary> /// 64位ID生成器,最高位为符号位,始终为0,可用位数63. /// 实例编号占10位,范围为0-1023 /// 时间戳和索引共占53位 /// </summary> public sealed class IdCreator { long timestamp = 0;//当前时间戳 long index = 0;//索引/计数器 long instanceID;//实例编号 int indexBitLength;//索引可用位数 long tsMax = 0;//时间戳最大值 long indexMax = 0; static IdCreator _default = new IdCreator(); /// <summary> /// /// </summary> /// <param name="instanceID">实例编号(0-1023)</param> /// <param name="indexBitLength">索引可用位数(1-32).每秒可生成ID数等于2的indexBitLength次方.大并发情况下,当前秒内ID数达到最大值时,将使用下一秒的时间戳,不影响获取ID.</param> /// <param name="initTimestamp">初始化时间戳,精确到秒.当之前同一实例生成ID的timestamp值大于当前时间的时间戳时, /// 有可能会产生重复ID(如持续一段时间的大并发请求).设置initTimestamp比最后的时间戳大一些,可避免这种问题</param> public IdCreator(int instanceID, int indexBitLength, long? initTimestamp = null) { if (instanceID < 0) { //这里给每个实例随机生成个实例编号 Random r = new Random(); this.instanceID = r.Next(0, 1024); } else { this.instanceID = instanceID % 1024; } if (indexBitLength < 1) { this.indexBitLength = 1; } else if (indexBitLength > 32) { this.indexBitLength = 32; } else { this.indexBitLength = indexBitLength; } tsMax = Convert.ToInt64(new string('1', 53 - indexBitLength), 2); indexMax = Convert.ToInt64(new string('1', indexBitLength), 2); if (initTimestamp != null) { this.timestamp = initTimestamp.Value; } } /// <summary> /// 默认每实例每秒生成65536个ID,从1970年1月1日起,累计可使用4358年 /// </summary> /// <param name="instanceID">实例编号(0-1023)</param> public IdCreator(int instanceID) : this(instanceID, 16) { } /// <summary> /// 默认每秒生成65536个ID,从1970年1月1日起,累计可使用4358年 /// </summary> public IdCreator() : this(-1) { } /// <summary> /// 生成64位ID /// </summary> /// <returns></returns> public long Create() { long id = 0; lock (this) { //增加时间戳部分 long ts = Harry.Common.Utils.GetTimeStamp() / 1000; ts = ts % tsMax; //如果超过时间戳允许的最大值,从0开始 id = ts << (10 + indexBitLength);//腾出后面部分,给实例编号和缩引编号使用 //增加实例部分 id = id | (instanceID << indexBitLength); //获取计数 if (timestamp < ts) { timestamp = ts; index = 0; } else { if (index > indexMax) { timestamp++; index = 0; } } id = id | index; index++; } return id; } /// <summary> /// 获取当前实例的时间戳 /// </summary> public long CurrentTimestamp { get { return this.timestamp; } } /// <summary> /// 默认每实例每秒生成65536个ID,从1970年1月1日起,累计可使用4358年 /// </summary> public static IdCreator Default { get { return _default; } } }
代碼說明
使用時,需要new一個IdCreator的實例,然後呼叫Create()方法,產生ID號.需要把IdCreator的例實賦給一個靜態變數,以保證ID號的唯一性.如果是分散式部署,需要給IdCreator的建構子傳遞instanceID參數,每一個部署都要有一個不同的值,範圍為0-1023.
構造函數中的indexBitLength參數,代表圖中最右邊的'序號'的長度,不再固定為12bit,範圍為1- 32.剩下的可用位,就留給了時間戳.
注意:IdCreator類的時間戳是按秒計的. 如果想改成毫秒,只需要將代碼long ts = Harry.Common.Utils.GetTimeStamp () / 1000;改成long ts = Harry.Common.Utils.GetTimeStamp();即可.
範例程式碼
IdCreator c=new IdCreator(0,16); var id=c.Create();

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Dreamweaver CS6
視覺化網頁開發工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。