日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

使用C#快速生成顺序GUID

發(fā)布時(shí)間:2023/12/4 C# 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用C#快速生成顺序GUID 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

通常,我們采用數(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。