目录

标签: C#

.Net Core 雪花算法(SnowFlake)

概述

分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移到Cassandra,因为Cassandra没有顺序ID生成机制,所以开发了这样一套全局唯一ID生成服务。

雪花算法的原始版本是 Scala 版,用于生成分布式ID(纯数字,时间顺序),订单编号等。

自增ID:对于数据敏感场景不宜使用,且不适合于分布式场景。
GUID:采用无意义字符串,数据量增大时造成访问过慢,且不宜排序。

算法描述

  • 最高位是符号位,始终为0,不可用。
  • 41位的时间序列,精确到毫秒级,41位的长度可以使用69年。时间位还有一个很重要的作用是可以根据时间进行排序。
  • 10位的机器标识,10位的长度最多支持部署1024个节点。
  • 12位的计数序列号,序列号即一系列的自增id,可以支持同一节点同一毫秒生成多个ID序号,12位的计数序列号支持每个节点每毫秒产生4096个ID序号。

.Net Core 的雪花算法

源码地址: https://github.com/stulzq/snowflake-net

我一般直接在 .net core 项目中使用 Nuget 获得该组件,进行直接使用,如下图:

Nuget 包管理器中搜索 snowflake 即可
var worker = new IdWorker(1, 1);
long id = worker.NextId();

以上代码, IdWorker 应该以单实例模式运行,否则会出现重复Id。

理论上两个参数:
在同一workid,datacenterid下,1ms 能产生2^12 – 1(4095)个id。
不同workid,datacenterid,1ms能产生2^22 – 1(近420w)个id, 1秒钟产生42亿个id