UUIDs&Uild 應用
UUIDs 概念
UUID 出自RFC 9562標準可以保證跨空間與時間的唯一性,長度總共16bytes或128bits,表示隨機產生這些字串並在某些條件下保證不會重複,這種方式對分散式系統在建立物件ID的地方是很有效益,因為可以保證在分散式系統是唯一值或是保證碰撞的可能性較低,也常應用在微服務架構中。當產生一組隨機序號,字串其中中間4表示UUID的版本,9隨機亂數。
C#呼叫Guid.NewGuid()就是產生UUID字串的方式
範例: cb9ec1e3-0cb1-4e33-9ee1-e86b725964f8
UUID v4範例
for (int i = 0; i < 10; i++)
Console.WriteLine(Guid.NewGuid())
/* 輸出
cb9ec1e3-0cb1-4e33-9ee1-e86b725964f8
d7250a44-9ccf-4b21-af55-e13cef7bc09b
3793f197-2d7b-4cad-b5f3-2c88946feb97
08845d8c-cf31-4cc2-b4fb-c23d2426ec56
88bd93f7-116b-4418-8954-b116f2995ebf
2ac06c87-8e2d-4515-9d84-25ee324d9efd
b9e911b0-a509-4d24-88ef-bc5739cc6024
91b2185c-92f7-4656-9bce-f9e0aba17181
7ca9976e-6cc4-424b-8453-2c591d9ba17f
1b4af183-d3cc-4571-b2c6-3b76a419b9c8
*/
- UUID 缺點
(1) UUID在資料庫insert會比較慢,如果大量寫入會很明顯 (2) UUID會造成index fragmentation, 因為UUID是隨機產生,當排序好的index架構會因為insert進來的資料造成產生很多碎片 (3) UUID高儲存成本,一筆資料需要16bytes或128bits
UUID改善碎片問題
UUIDv7使用unix timestampe 來產生前48bit字串,這種方式可以減少碎片化的問題,目前C# Net 8.0之前都沒有提供Uuid v7的實作,可以使用Uild的框架使用
-
使用ULID (Universally Unique Lexicographically Sortable Identifier) 長度為128bit,其中組合48 bit 時間戳+80 bit 隨機數(使用字典方式產生),好處可排序。目前Uild在Nuget版本為1.3.4為穩定版本。ULID可以一毫秒產生<2^80保證數字唯一性
-
ULID github 源碼 https://github.com/Cysharp/Ulid?tab=readme-ov-file
for (int i = 0; i < 10; i++)
Console.WriteLine(Ulid.NewUlid());
/* 輸出
01JHVGMJN15KAGT9RXW2YZ05DB
01JHVGMJN1VQK1KKFG1DTBTFPZ
01JHVGMJN1Q65550TMTY8A6TV0
01JHVGMJN1RYGACZGH29K391CX
01JHVGMJN1P1XA2VC0C72M85Y7
01JHVGMJN1FXK56WY1ZMP9JBR5
01JHVGMJN1QSK256W2H22XXXP7
01JHVGMJN1MZPVGM33R6R20M3Z
01JHVGMJN17SMWANBQ24VWVSJ2
01JHVGMJN1KVCSB92W0R03BBFX
*/
留言
張貼留言