使用 C# 快速生成顺序 GUID

前言

通常,我们采用数值 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),保证运行在同一台机器上的多个进程生成的标识符不会重复:

1
NewId.SetProcessIdProvider(new CurrentProcessIdProvider());

最后,生成 GUID

1
var guid = NewId.NextGuid();

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

0%