steve-warren/ksuid
GitHub: steve-warren/ksuid
面向 .NET 的高性能零分配 KSUID 生成库,为高吞吐分布式系统提供时间有序且全局唯一的标识符生成能力。
Stars: 29 | Forks: 1
# KsuidDotNet [](https://www.nuget.org/packages/KsuidDotNet)
一个高性能、零分配的 KSUID(Key Sortable Unique Identifier,键可排序唯一标识符)生成器,适用于 .NET 8 和 .NET 10。
专为位于热路径上需要进行唯一 ID 生成的高吞吐量数据库引擎和分布式系统而设计。
## 🚀性能
该库专为速度而生。它利用硬件内置指令、stackalloc 和缓冲 RNG 策略,性能表现优于标准实现。
- 生成 crypto-random KSUID 字符串
- 极速的性能表现
- 无额外内存开销,仅为 string 分配内存
- 线程安全且无锁
- 支持 .net 8、.net 10
### 核心优化
- 零分配:使用 `string.Create` 和 `Span` 直接写入
堆,绕过中间的 string 分配。
- 缓冲 RNG:使用线程静态缓冲区,将 Syscall
(随机数)的开销分摊降低约 99%。
- 数学内置指令:利用现代 .NET 的 `Math.DivRem` 和 `BinaryPrimitives` 来
优化 Base62 编码循环。
## 安装
```
$ dotnet add package KsuidDotNet
```
## 使用方法
生成随机 KSUID:
```
string id = Ksuid.NewKsuid();
Console.WriteLine(id); // outputs 29faSiN1gPB6IzM74u6tMfTO02L
```
生成带有 `cust_` 前缀的随机 KSUID `string`:
```
string id = Ksuid.NewKsuid("cust_");
Console.WriteLine(id); // outputs c_29faSiN1gPB6IzM74u6tMfTO02L
```
## 微基准测试
KsuidDotNet 与其他 KSUID 库的基准测试结果。
### X64: Ryzen 9950X3D
```
BenchmarkDotNet v0.15.6, Windows 11 (10.0.26200.8037)
AMD Ryzen 9 9950X3D 4.30GHz, 1 CPU, 32 logical and 16 physical cores
.NET SDK 10.0.104
[Host] : .NET 10.0.4 (10.0.4, 10.0.426.12010), X64 RyuJIT x86-64-v4
DefaultJob : .NET 10.0.4 (10.0.4, 10.0.426.12010), X64 RyuJIT x86-64-v4
```
| 方法 | 平均时间 | 最小时间 | 最大时间 | 每秒操作数 | Gen0 | 已分配 |
|--------------------------------------------- |---------:|---------:|---------:|-------------:|-------:|----------:|
| 'NewKsuid() - Real World' | 62.27 ns | 62.13 ns | 62.36 ns | 16,059,914.6 | 0.0015 | 80 B |
| 'NewKsuid(Prefix) - Real World' | 63.03 ns | 62.66 ns | 63.27 ns | 15,865,375.5 | 0.0017 | 88 B |
| 'NewKsuid(DateTime, Prefix) - Deterministic' | 43.31 ns | 43.19 ns | 43.41 ns | 23,089,671.4 | 0.0017 | 88 B |
### ARM64: M2 Ultra
```
BenchmarkDotNet v0.15.6, macOS Sequoia 15.4 (24E248) [Darwin 24.4.0]
Apple M2 Ultra, 1 CPU, 24 logical and 24 physical cores
.NET SDK 10.0.201
[Host] : .NET 10.0.5 (10.0.5, 10.0.526.15411), Arm64 RyuJIT armv8.0-a
DefaultJob : .NET 10.0.5 (10.0.5, 10.0.526.15411), Arm64 RyuJIT armv8.0-a
```
| 方法 | 平均时间 | 最小时间 | 最大时间 | 每秒操作数 | Gen0 | 已分配 |
|--------------------------------------------- |---------:|---------:|---------:|-------------:|-------:|----------:|
| 'NewKsuid() - Real World' | 76.91 ns | 76.57 ns | 77.23 ns | 13,001,667.4 | 0.0095 | 80 B |
| 'NewKsuid(Prefix) - Real World' | 77.70 ns | 76.70 ns | 78.19 ns | 12,870,678.6 | 0.0105 | 88 B |
| 'NewKsuid(DateTime, Prefix) - Deterministic' | 58.82 ns | 58.51 ns | 59.09 ns | 17,001,186.1 | 0.0105 | 88 B |
## 许可证
本库为开源软件,基于 MIT [许可证](LICENSE) 发布。
标签:分布式系统, 响应大小分析, 唯一ID生成, 开发工具库