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算法