Yitter.IdGenerator和GenId生成Id格式的比较

文章对比了Yitter和IdGen两个雪花ID生成库,探讨了它们在工作ID和序列位长度设置下的ID格式一致性,以及是否可以混用ID数据。尽管两者在结构上相似,但Yitter预留给时间回拨的5个数值使得其理论寿命更长。文章未涉及执行效率的比较,鼓励读者参考官方文档了解更多详情。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,两种库都有特点,感兴趣的请移步各自官网查看详情。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值