使用C#快速生成顺序GUID
前言
通常,我們采用數值ID(long)/GUID作為全局唯一標識符。
但是,在多線程、高并發情況下,由應用程序生成數值ID容易產生重復,而由數據庫生成又會造成性能瓶頸。
而使用Guid.NewGuid()生成的GUID雖然不會重復,但是它是無序的,不適合作為數據庫主鍵,會產生大量索引碎片,影響性能。
有不有什么方法,能生成既是順序的,又不會重復的全局唯一標識符?
snowflake
大家可能首先想到的是snowflake,Twitter開源的分布式ID生成算法,它會生成一個long型(64bit)的ID。
其中,前41bit是時間戳,接下來的10bit代表機器ID,防止沖突,后12bit代表序列號,以便在同一毫秒內創建多個ID。
但是,機器ID導致了無法去中心化,必須有一個全局生成機器ID的機制作為額外協調。
這時,你可以嘗試一下NewId。
NewId
NewId是一個連續ID生成器,它使用主機MAC地址,結合時間戳和遞增的序列號實現ID生成策略。
由于MAC地址全局唯一,因此NewId無需機器ID這樣的額外設施,即可生成按時間順序排序的全局唯一標識符。
使用方式非常簡單。
首先,引用Nuget包NewId。
然后,設置生成標識符時包含processId(進程Id),保證運行在同一臺機器上的多個進程生成的標識符不會重復:
NewId.SetProcessIdProvider(new?CurrentProcessIdProvider());最后,生成GUID:
var?guid?=?NewId.NextGuid();我們嘗試了生成多個GUID,發現確實是連續的:
結論
生成順序GUID又會造成Id容易被猜測,這時,可以結合我們上次的文章(保護我方Id
如果你覺得這篇文章對你有所啟發,請關注我的個人公眾號”My IO“
總結
以上是生活随笔為你收集整理的使用C#快速生成顺序GUID的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IEnumerable.OrderBy(
- 下一篇: 使用 WPF + Chrome 内核实现