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

相关文章
相关标签/搜索