我们的项目需要在本地生成一个唯一的ID,于是考虑到用SnowFlake算法来实现,经过调研,Github上找到了一个开源库,用起来十分方便。使用方法分享如下:

Github地址

RobThree/IdGen

使用说明

1. 引入

在NuGet中查找IdGen.Configuration,并导入项目

2. 修改配置文件(App.config)

添加如下配置(注意:configSections要放在最前面):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="idGenSection"
type="IdGen.Configuration.IdGeneratorsSection, IdGen.Configuration" />
</configSections>

<idGenSection>
<idGenerators>
<!-- 64Bit: Sign(1Bit) Timestamp(41Bits) Generator(10Bits) Sequence(12Bits) -->
<!-- 不同厂家要使用不同的id -->
<idGenerator name="MySnowFlake" id="2048" epoch="2021-01-01T00:00:00"
timestampBits="41" generatorIdBits="16" sequenceBits="6" />
</idGenerators>
</idGenSection>

</configuration>

3. 使用示例

1
2
3
4
5
6
7
static void Main(string[] args)
{
/// Demo: 复杂用法,根据配置文件生成
var confGenerator = AppConfigFactory.GetFromConfig("MySnowFlake");
var id = confGenerator.CreateId();
Console.ReadKey();
}

4. 其他说明

4.1 关于配置文件

默认ID构成如下:

Sign(1bit) — Timestamp(41bits) — Generator(10bits) — Sequence(12bits)

可以通过配置文件修改ID构成,例如示例中的配置方法(timestampBits=”41” generatorIdBits=”16” sequenceBits=”6”)是:

1(符号位)-41(约69年)-16(65536份软件实例)-6(每毫秒产生64个)

算法无法完全保证ID绝对唯一,可以考虑不同的用户分配不同的ID来解决,例如配置文件中的id=”2048”。