该项目是 Olivier Poitrey 对 https://github.com/rs/xid 的 .Net 移植(经过修改)。代码和本自述文件的重要部分基于该项目。
Xid.Net 是一个全球唯一的 id 生成器库,可以直接在您的代码中安全地使用。它提供了一个类似于System.Guid 的接口,但生成的 id 更小(原始格式为 12 字节 vs 16 字节,转换为字符串时为 20 字节 vs 36 字节)。生成 Xids 比 Guid 更快,而且通常速度更快。
Xid 使用 Mongo 对象 ID 算法生成具有不同序列化(base32 与 base64)的全局唯一 id,以使其在作为字符串传输时更短:https://docs.mongodb.org/manual/reference/object-id/。
PM > Install-Package Yort.Xid.Net创建一个 Xid;
var id = Xid . NewXid ( ) ;将Xid转换为字符串;
var id = Xid . NewXid ( ) ;
var idString = id . ToString ( ) ;将字符串转换为 Xid(还提供了 TryParse 方法);
var idString = " 9m4e2mr0ui3e8a215n4g " ;
var id = Xid . Parse ( idString ) ;转换Xid为字节数组;
var id = Xid . NewXid ( ) ;
var bytes = id . ToBytes ( ) ;或者
var id = Xid . NewXid ( ) ;
var preallocatedByteArray = new byte [ 12 ] ;
var bytes = id . ToBytes ( preallocatedByteArray ) ;获取 Xid 的组件;
var xid = Xid . NewXid ( ) ;
DateTime timestamp = xid . GetTimeStamp ( ) ;
byte [ ] machineId = xid . GetMachineId ( ) ;
UInt16 processId = xid . GetProcessId ( ) ;
int counter = xid . GetCounter ( ) ;还支持.Net 实现的/其他功能;
Xid 的格式为:
id 的二进制表示与 Mongo 12 字节对象 ID 兼容。字符串表示形式使用 base32 十六进制(无填充),以便以该形式(20 字节)存储时获得更好的空间效率。 Base32 的十六进制变体用于保留 id 的可排序属性。
Xid 不使用 base64,因为区分大小写和 2 个非字母字符在不同系统之间作为字符串传输时可能会出现问题。未使用 Base36,因为它不是标准,结果大小不可预测(不是位对齐),并且无法保持可排序。要验证 Base32 xid,需要使用 a 到 v 范围内的字符和 0 到 9 数字 ([0-9a-v]{20}) 的 20 个字符长、全小写序列。
UUID 是 16 个字节(128 位)和 36 个字符的字符串表示形式。 Twitter Snowflake id 为 8 字节(64 位),但需要机器/数据中心配置和/或中央生成器服务器。 Xid 介于 12 字节(96 位)和更紧凑的 URL 安全字符串表示形式(20 个字符)之间。无需配置或中央生成器服务器,因此可以直接在应用程序代码中使用。
| 姓名 | 二进制大小 | 字符串大小 | 特征 |
|---|---|---|---|
| 通用唯一标识符 | 16字节 | 36 个字符 | 自由配置,不可排序 |
| 短UID | 16字节 | 22 个字符 | 自由配置,不可排序 |
| 雪花 | 8字节 | 最多 20 个字符 | 需要机器/DC配置,需要中央服务器,可排序 |
| 蒙戈ID | 12字节 | 24 个字符 | 免配置、可排序 |
| 西德 | 12字节 | 20 个字符 | 免配置、可排序 |
32位
BenchmarkDotNet=v0.10.9,操作系统=Windows 10 Redstone 2 (10.0.15063)
处理器=Intel Core i7-6820HQ CPU 2.70GHz (Skylake), ProcessorCount=8
频率=2648436 Hz,分辨率=377.5813 ns,定时器=TSC
[主机]:.NET Framework 4.7 (CLR 4.0.30319.42000),32 位 LegacyJIT-v4.7.2101.1
默认作业:.NET Framework 4.7 (CLR 4.0.30319.42000),32 位 LegacyJIT-v4.7.2101.1
| 方法 | 意思是 | 错误 | 标准差 |
|---|---|---|---|
| 创建XidBenchmark | 36.94纳秒 | 0.2248纳秒 | 0.2103纳秒 |
| 创建GuidBenchmark | 201.27纳秒 | 6.9994纳秒 | 6.5473纳秒 |
64位
BenchmarkDotNet=v0.10.9,操作系统=Windows 10 Redstone 2 (10.0.15063)
处理器=Intel Core i7-6820HQ CPU 2.70GHz (Skylake), ProcessorCount=8
频率=2648436 Hz,分辨率=377.5813 ns,定时器=TSC
[主机]:.NET Framework 4.7 (CLR 4.0.30319.42000),64 位 RyuJIT-v4.7.2101.1
默认作业:.NET Framework 4.7 (CLR 4.0.30319.42000),64 位 RyuJIT-v4.7.2101.1
| 方法 | 意思是 | 错误 | 标准差 |
|---|---|---|---|
| 创建XidBenchmark | 23.56纳秒 | 0.1409纳秒 | 0.1100纳秒 |
| 创建GuidBenchmark | 82.41纳秒 | 0.2656纳秒 | 0.2354纳秒 |
所有源代码均根据 MIT 许可证获得许可。原始 Xid 存储库许可证位于;西德许可证。