snowflake分布式唯一id c#實現
阿新 • • 發佈:2018-02-11
using mov 如果 twitter .cn center 之前 last bit
snowflake算法
snowflake是Twitter開源的分布式ID生成算法,結果是一個long型的ID。其核心思想是:使用41bit作為毫秒數,10bit作為機器的ID(5個bit是數據中心,5個bit的機器ID),12bit作為毫秒內的流水號(意味著每個節點在每毫秒可以產生 4096 個 ID),最後還有一個符號位,永遠是0。
剛剛看到一篇討論snowflake的文章,之前也看過一些介紹分布式ID生成的算法.但是一直沒有用c#實現過.這次正好實現以下.代碼的話基本上是翻譯了一下那篇文章裏的java代碼
核心代碼如下
var timestamp = TimeGen(); //如果當前時間小於上一次ID生成的時間戳,說明系統時鐘回退過這個時候應當拋出異常 if (timestamp < _lastTimestamp) { throw new Exception($"Clock moved backwards. Refusing to generate id for {_lastTimestamp - timestamp} milliseconds"); } //如果是同一時間生成的,則進行毫秒內序列 if (_lastTimestamp == timestamp) { _sequence = (_sequence + 1) & _sequenceMask; //毫秒內序列溢出 if (_sequence == 0) { //阻塞到下一個毫秒,獲得新的時間戳 timestamp = TilNextMillis(_lastTimestamp); } } //時間戳改變,毫秒內序列重置 else { _sequence = 0L; } //上次生成ID的時間截 _lastTimestamp = timestamp; //移位並通過或運算拼到一起組成64位的ID return ((timestamp - Twepoch) << _timestampLeftShift) | (DataCenterId << _datacenterIdShift) | (WorkerId << _workerIdShift) | _sequence;
由於c#和java的語法還是比較像的,代碼幾乎就是復制粘貼.更多的討論請看上面的文章.
github
snowflake分布式唯一id c#實現