迄今为止最全面的分布式主键ID生成器,其具有以下这些特点
- 这是优化的雪花算法(雪花漂移),它生成的ID更短、速度更快
- 支持 k8s 等容器环境自动扩容(自动注册 WorkerId),可在单机或分布式环境生成数字型唯一ID。
- 支持多语言,原生支持 C#/Java/Go/Rust/C/SQL/Node.js/PHP(C扩展) 等语言,并提供Python、PB多线程安全调用动态库(FFI)。
- 兼容所有雪花算法(号段模式或经典模式,大厂或小厂),将来你可以做任意的升级切换。(一般无须升级,但理论上支持)
- 整形数字,随时间单调递增(不一定连续),长度更短,用50年都不会超过 js Number类型最大值。(默认配置)
- 速度更快,是传统雪花算法的2-5倍,0.1秒可生成50万个(基于8代低压i7)。
- 支持时间回拨处理。比如服务器时间回拨1秒,本算法能自动适应生成临界时间的唯一ID。
- 支持手工插入新ID。当业务需要在历史时间生成新ID时,用本算法的预留位能生成5000个每秒。
- 基础功能,开箱即用,无需配置文件、数据库连接等。
来源:GitHub(668) https://github.com/yitter/IdGenerator
协议:MIT
示例首先到nuget上安装Yitter.IdGenerator最新的包。
// 创建 IdGeneratorOptions 对象,请在构造函数中输入 WorkerId:
var options = new IdGeneratorOptions(1);
// options.WorkerIdBitLength = 10; // WorkerIdBitLength 默认值6,支持的 WorkerId 最大值为2^6-1,若 WorkerId 超过64,可设置更大的 WorkerIdBitLength
// ...... 其它参数设置参考 IdGeneratorOptions 定义,一般来说,只要再设置 WorkerIdBitLength (决定 WorkerId 的最大值)。
// 保存参数(必须的操作,否则以上设置都不能生效):
YitIdHelper.SetIdGenerator(options);
// 以上初始化过程只需全局一次,且必须在第2步之前设置。
// 初始化以后,即可在任何需要生成ID的地方,调用以下方法:
var newId = YitIdHelper.NextId();
如果基于DI框架集成,可以参考 YitIdHelper 去管理 IdGenerator 对象,必须使用单例模式。
个人特地安装了IdGenerator包,运行20次生成了如下20条ID主键,性能和长度都能接受。
性能
10位自增序列,1000次漂移最大值
连续请求量 |
5K |
5W |
50W |
传统雪花算法 |
0.0045s |
0.053s |
0.556s |
雪花漂移算法 |
0.0015s |
0.012s |
0.113s |
极致性能:500W/s~3000W/s。(所有测试数据均基于8代低压i7计算)
129053495681099 (运行1年)
387750301904971 (运行3年)
646093214093387 (运行5年)
1292658282840139 (运行10年)
9007199254740992 (js Number 最大值,可以支撑70年)
165399880288699493 (普通雪花算法生成的ID)
目前唯一ID的实现方式非常多,该开源包作为雪花算法的升级版,其长度压缩,性能提升,实现方式非常简单,是个不错的开源源码,并且其几乎支持市面上主流开发语言。C#语言下的代码粗略的浏览过,代码量不多,总共就几个类,而且其是MIT协议的,甚至可以直接将其几个类文件直接整合到项目之中。
,