nuget经常看到两个雪花id库,前者介绍的可用7000年太过吸引人,所以仔细对比了下。
Yitter官网介绍有些例子都是workIdLength和seqBitLength极限情况下取得的,相同情况下两者使用年限相近。
两个库都提供了workid和序列位长度设置,本文没有比较执行效率,仅确认Id格式是否一致,不同项目是否可以混用Id数据,以便放心使用。以下代码均是github截取稍作修改。
using IdGen;
using System;
using Yitter.IdGenerator;
namespace SnowFlake
{
class Program
{
public static long YitterIdGen(byte workIdBitLength, byte seqBitLength,DateTime baseTime,ushort workId)
{
// 创建 IdGeneratorOptions 对象,可在构造函数中输入 WorkerId:
var options = new Yitter.IdGenerator.IdGeneratorOptions(workId);
options.WorkerIdBitLength = workIdBitLength; // 默认值6,限定 WorkerId 最大值为2^6-1,即默认最多支持64个节点。
options.SeqBitLength = seqBitLength; // 默认值6,限制每毫秒生成的ID个数。若生成速度超过5万个/秒,建议加大 SeqBitLength 到 10。
options.BaseTime = baseTime; //基准时间
// ...... 其它参数参考 IdGeneratorOptions 定义。
options.Method = 1; //1雪花漂移算法//2常规雪花算法
// 保存参数(务必调用,否则参数设置不生效):
YitIdHelper.SetIdGenerator(options);
var newId = YitIdHelper.NextId();
// 以上过程只需全局一次,且应在生成ID之前完成。
return newId;
}
public static long IdGen(byte workIdBitLength, byte seqBitLength, DateTime baseTime, ushort workId)
{
//基准时间
var epoch = baseTime;
// Create an ID with 41 bits for timestamp, 10 for generator-id
// and 12 for sequence
var structure = new IdStructure((byte)(64-workIdBitLength- seqBitLength-1), workIdBitLength, seqBitLength);
// Prepare options
var options = new IdGen.IdGeneratorOptions(structure, new DefaultTimeSource(epoch));
// Create an IdGenerator with it's generator-id set to 0, our custom epoch
// and id-structure
var generator = new IdGenerator(workId, options);
var id = generator.CreateId();
return id;
}
static void Main(string[] args)
{
DateTime baseTime=DateTime.Now.ToUniversalTime();
//雪花默认位数41,10,12 //Yitter默认51,6,6//此处统一按雪花默认格式
long yitterId=YitterIdGen(10, 12, baseTime, 1);
long idGenId = IdGen(10, 12, baseTime, 1);
Console.WriteLine("YitterId=" + yitterId);
Console.WriteLine("GenId=" + idGenId);
//二进制位数对比
Console.WriteLine(Convert.ToString(yitterId, 2));
Console.WriteLine(Convert.ToString(idGenId, 2));
}
}
}
从基准时间等待几秒后生成的ID,YitterID比GenId早n毫秒
YitterId = 25295851525
GenId = 27120373760
--YitterId预留5个数值用于时间回拨和手动生成,末尾从5开始
1011110001111-0000000001-000000000101
--GenId
1100101000010-0000000001-000000000000
从Bit位看到,有相同的机器Id,相同的序列位,两种工具生成的Id结构相同
因为YitterID和GenId生成Id的结构基本相同,Yitter的5个预留数不考虑的情况下,标准格式下雪花ID寿命都是 (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69年
最后,感谢库作者付出为大家提供IdGenerator,两种库都有特点,感兴趣的请移步各自官网查看详情。