1. 程式人生 > >snowflake分布式唯一id c#實現

snowflake分布式唯一id c#實現

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#實現