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