使用C#快速生成顺序GUID

本文探讨了在多线程、高并发环境下如何生成全局唯一标识符。Snowflake算法虽然广泛使用,但其无序性可能导致索引碎片。而NewId利用MAC地址和时间戳生成有序且唯一的ID,避免了额外的机器ID协调。通过实例展示了NewId生成连续GUID的特性,为需要顺序ID的场景提供了方案。

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

前言

通常,我们采用数值ID(long)/GUID作为全局唯一标识符。

但是,在多线程、高并发情况下,由应用程序生成数值ID容易产生重复,而由数据库生成又会造成性能瓶颈。

而使用Guid.NewGuid()生成的GUID虽然不会重复,但是它是无序的,不适合作为数据库主键,会产生大量索引碎片,影响性能。

有不有什么方法,能生成既是顺序的,又不会重复的全局唯一标识符?

snowflake

大家可能首先想到的是snowflake,Twitter开源的分布式ID生成算法,它会生成一个long型(64bit)的ID。

其中,前41bit是时间戳,接下来的10bit代表机器ID,防止冲突,后12bit代表序列号,以便在同一毫秒内创建多个ID。

但是,机器ID导致了无法去中心化,必须有一个全局生成机器ID的机制作为额外协调。

这时,你可以尝试一下NewId。

NewId

NewId是一个连续ID生成器,它使用主机MAC地址,结合时间戳和递增的序列号实现ID生成策略。

由于MAC地址全局唯一,因此NewId无需机器ID这样的额外设施,即可生成按时间顺序排序的全局唯一标识符。

使用方式非常简单。

首先,引用Nuget包NewId

然后,设置生成标识符时包含processId(进程Id),保证运行在同一台机器上的多个进程生成的标识符不会重复:

NewId.SetProcessIdProvider(new CurrentProcessIdProvider());

最后,生成GUID:

var guid = NewId.NextGuid();

我们尝试了生成多个GUID,发现确实是连续的:

70d224b0fd4dc3f23809598e2982ddba.png

结论

生成顺序GUID又会造成Id容易被猜测,这时,可以结合我们上次的文章保护我方Id

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值