snowflake分佈式惟一id c#實現

snowflake算法

snowflake是Twitter開源的分佈式ID生成算法,結果是一個long型的ID。其核心思想是:使用41bit做爲毫秒數,10bit做爲機器的ID(5個bit是數據中心,5個bit的機器ID),12bit做爲毫秒內的流水號(意味着每一個節點在每毫秒能夠產生 4096 個 ID),最後還有一個符號位,永遠是0。html

剛剛看到一篇討論snowflake的文章,以前也看過一些介紹分佈式ID生成的算法.可是一直沒有用c#實現過.此次正好實現如下.代碼的話基本上是翻譯了一下那篇文章裏的java代碼java

核心代碼以下git

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

github算法

相關文章
相關標籤/搜索