โครงการนี้เป็นพอร์ต .Net (พร้อมการแก้ไข) ของ https://github.com/rs/xid โดย Olivier Poitrey ส่วนสำคัญของโค้ดและ readme นี้อิงจากโปรเจ็กต์นั้น
Xid.Net เป็นไลบรารีตัวสร้างรหัสที่ไม่เหมือนใครทั่วโลก ซึ่งพร้อมใช้งานอย่างปลอดภัยและโดยตรงในโค้ดของคุณ มันมีอินเทอร์เฟซ คล้าย กับ System.Guid แต่สร้างรหัสที่เล็กกว่า (12 ไบต์เทียบกับ 16 ในรูปแบบ raw, 20 กับ 36 เมื่อแปลงเป็นสตริง) การสร้าง Xids นั้นเร็วกว่า Guids ซึ่งมักจะสำคัญมาก
Xid ใช้อัลกอริธึม Mongo Object ID เพื่อสร้าง ID ที่ไม่ซ้ำกันทั่วโลกด้วยซีเรียลไลซ์ที่แตกต่างกัน (base32 เทียบกับ base64) เพื่อให้สั้นลงเมื่อขนส่งเป็นสตริง: 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 นั้นเข้ากันได้กับ Object ID ของ Mongo ขนาด 12 ไบต์ การแสดงสตริงใช้ฐานสิบหกฐาน 32 (ไม่มีช่องว่างภายใน) เพื่อประสิทธิภาพพื้นที่ที่ดีขึ้นเมื่อจัดเก็บในรูปแบบนั้น (20 ไบต์) ตัวแปรฐานสิบหกของ base32 ใช้เพื่อรักษาคุณสมบัติการเรียงลำดับของ id
Xid ไม่ใช้ base64 เนื่องจากความไวของตัวพิมพ์เล็กและตัวอักษรที่ไม่ใช่ตัวอักษร 2 ตัวอาจเป็นปัญหาเมื่อขนส่งเป็นสตริงระหว่างระบบต่างๆ ไม่ได้ใช้ Base36 เนื่องจากไม่ได้มาตรฐาน ขนาดผลลัพธ์ไม่สามารถคาดเดาได้ (ไม่จัดแนวบิต) และไม่สามารถจัดเรียงได้ ในการตรวจสอบความถูกต้องของ base32 xid คาดว่าจะมีความยาว 20 อักขระ ลำดับตัวพิมพ์เล็กทั้งหมดโดยใช้อักขระในช่วงของตัวเลข a ถึง v และ 0 ถึง 9 ([0-9a-v]{20})
UUID คือ 16 ไบต์ (128 บิต) และ 36 ตัวอักษรเป็นการแสดงสตริง รหัส Twitter Snowflake มีขนาด 8 ไบต์ (64 บิต) แต่ต้องมีการกำหนดค่าเครื่อง/ศูนย์ข้อมูล และ/หรือเซิร์ฟเวอร์ตัวสร้างส่วนกลาง Xid อยู่ระหว่าง 12 ไบต์ (96 บิต) โดยมีการแสดงสตริงที่ปลอดภัยต่อ URL ที่กะทัดรัดยิ่งขึ้น (20 ตัวอักษร) ไม่จำเป็นต้องมีการกำหนดค่าหรือเซิร์ฟเวอร์เครื่องกำเนิดไฟฟ้าส่วนกลาง จึงสามารถนำไปใช้ในโค้ดแอปพลิเคชันได้โดยตรง
ชื่อ | ขนาดไบนารี | ขนาดสตริง | คุณสมบัติ |
---|---|---|---|
UUID | 16 ไบต์ | 36 ตัวอักษร | ไม่มีการกำหนดค่า ไม่สามารถจัดเรียงได้ |
สั้น ๆ | 16 ไบต์ | 22 ตัวอักษร | ไม่มีการกำหนดค่า ไม่สามารถจัดเรียงได้ |
เกล็ดหิมะ | 8 ไบต์ | มากถึง 20 ตัวอักษร | ต้องการการกำหนดค่าเครื่อง/DC ต้องการเซิร์ฟเวอร์กลาง สามารถจัดเรียงได้ |
MongoID | 12 ไบต์ | 24 ตัวอักษร | ไม่มีการกำหนดค่า สามารถจัดเรียงได้ |
ซิด | 12 ไบต์ | 20 ตัวอักษร | ไม่มีการกำหนดค่า สามารถจัดเรียงได้ |
32 บิต
BenchmarkDotNet=v0.10.9, OS=Windows 10 Redstone 2 (10.0.15063)
โปรเซสเซอร์=ซีพียู Intel Core i7-6820HQ 2.70GHz (Skylake), จำนวนโปรเซสเซอร์=8
ความถี่=2648436 Hz, ความละเอียด=377.5813 ns, ตัวจับเวลา=TSC
[โฮสต์] : .NET Framework 4.7 (CLR 4.0.30319.42000), 32 บิต LegacyJIT-v4.7.2101.1
DefaultJob : .NET Framework 4.7 (CLR 4.0.30319.42000), 32 บิต LegacyJIT-v4.7.2101.1
วิธี | หมายถึง | ข้อผิดพลาด | มาตรฐาน |
---|---|---|---|
CreateXidBenchmark | 36.94 น | 0.2248 นส | 0.2103 นส |
สร้างGuidBenchmark | 201.27 น | 6.9994 น | 6.5473 น |
64 บิต
BenchmarkDotNet=v0.10.9, OS=Windows 10 Redstone 2 (10.0.15063)
โปรเซสเซอร์=ซีพียู Intel Core i7-6820HQ 2.70GHz (Skylake), จำนวนโปรเซสเซอร์=8
ความถี่=2648436 Hz, ความละเอียด=377.5813 ns, ตัวจับเวลา=TSC
[โฮสต์] : .NET Framework 4.7 (CLR 4.0.30319.42000), 64 บิต RyuJIT-v4.7.2101.1
DefaultJob : .NET Framework 4.7 (CLR 4.0.30319.42000), 64 บิต RyuJIT-v4.7.2101.1
วิธี | หมายถึง | ข้อผิดพลาด | มาตรฐาน |
---|---|---|---|
CreateXidBenchmark | 23.56 น | 0.1409 น | 0.1100 น |
สร้างGuidBenchmark | 82.41 น | 0.2656 นส | 0.2354 น |
ซอร์สโค้ดทั้งหมดได้รับอนุญาตภายใต้ใบอนุญาต MIT ใบอนุญาต Xid repo ดั้งเดิมที่; ใบอนุญาต Xid