steve-warren/ksuid

GitHub: steve-warren/ksuid

面向 .NET 的高性能零分配 KSUID 生成库,为高吞吐分布式系统提供时间有序且全局唯一的标识符生成能力。

Stars: 29 | Forks: 1

# KsuidDotNet [![nuget](https://img.shields.io/nuget/v/KsuidDotNet?style=flat-square)](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生成, 开发工具库