国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) 類庫(kù)下載 C#類別庫(kù) c#分散式ID產(chǎn)生器

c#分散式ID產(chǎn)生器

Nov 04, 2016 pm 04:48 PM
c#

簡(jiǎn)介

這個(gè)是根據(jù)twitter的snowflake來(lái)寫(xiě)的.這裡有中文的介紹.

c#分散式ID產(chǎn)生器


如上圖所示,一個(gè)64位ID,除了最左邊的符號(hào)位不用固定為左邊符號(hào)位而以確保產(chǎn)生的ID都是正數(shù)),還剩餘63位可用.

下面的代碼與圖中的位數(shù)分配略有不同,除了中間部分10bit工作機(jī)器id不變,時(shí)間戳和序號(hào)的位數(shù)是可以根據(jù)自己的需求變化的,就是說(shuō),你可以把中間的工作機(jī)器ID往左挪一挪,或往右挪一挪.

代碼

/// <summary>
    /// 64位ID生成器,最高位為符號(hào)位,始終為0,可用位數(shù)63.
    /// 實(shí)例編號(hào)占10位,范圍為0-1023
    /// 時(shí)間戳和索引共占53位
    /// </summary>
    public sealed class IdCreator
    {        long timestamp = 0;//當(dāng)前時(shí)間戳
        long index = 0;//索引/計(jì)數(shù)器
        long instanceID;//實(shí)例編號(hào)
        int indexBitLength;//索引可用位數(shù)
        long tsMax = 0;//時(shí)間戳最大值
        long indexMax = 0;        static IdCreator _default = new IdCreator();        /// <summary>
        /// 
        /// </summary>
        /// <param name="instanceID">實(shí)例編號(hào)(0-1023)</param>
        /// <param name="indexBitLength">索引可用位數(shù)(1-32).每秒可生成ID數(shù)等于2的indexBitLength次方.大并發(fā)情況下,當(dāng)前秒內(nèi)ID數(shù)達(dá)到最大值時(shí),將使用下一秒的時(shí)間戳,不影響獲取ID.</param>
        /// <param name="initTimestamp">初始化時(shí)間戳,精確到秒.當(dāng)之前同一實(shí)例生成ID的timestamp值大于當(dāng)前時(shí)間的時(shí)間戳?xí)r,
        /// 有可能會(huì)產(chǎn)生重復(fù)ID(如持續(xù)一段時(shí)間的大并發(fā)請(qǐng)求).設(shè)置initTimestamp比最后的時(shí)間戳大一些,可避免這種問(wèn)題</param>
        public IdCreator(int instanceID, int indexBitLength, long? initTimestamp = null)        {            if (instanceID < 0)
            {                //這里給每個(gè)實(shí)例隨機(jī)生成個(gè)實(shí)例編號(hào)
                Random r = new Random();                this.instanceID = r.Next(0, 1024);
            }            else
            {                this.instanceID = instanceID % 1024;
            }            if (indexBitLength < 1)
            {                this.indexBitLength = 1;
            }            else if (indexBitLength > 32)            {                this.indexBitLength = 32;
            }            else
            {                this.indexBitLength = indexBitLength;
            }
            tsMax = Convert.ToInt64(new string(&#39;1&#39;, 53 - indexBitLength), 2);
            indexMax = Convert.ToInt64(new string(&#39;1&#39;, indexBitLength), 2);            if (initTimestamp != null)
            {                this.timestamp = initTimestamp.Value;
            }
        }        /// <summary>
        /// 默認(rèn)每實(shí)例每秒生成65536個(gè)ID,從1970年1月1日起,累計(jì)可使用4358年
        /// </summary>
        /// <param name="instanceID">實(shí)例編號(hào)(0-1023)</param>
        public IdCreator(int instanceID) : this(instanceID, 16)        {

        }        /// <summary>
        /// 默認(rèn)每秒生成65536個(gè)ID,從1970年1月1日起,累計(jì)可使用4358年
        /// </summary>
        public IdCreator() : this(-1)        {

        }        /// <summary>
        /// 生成64位ID
        /// </summary>
        /// <returns></returns>
        public long Create()        {            long id = 0;            lock (this)
            {                //增加時(shí)間戳部分
                long ts = Harry.Common.Utils.GetTimeStamp() / 1000;

                ts = ts % tsMax;  //如果超過(guò)時(shí)間戳允許的最大值,從0開(kāi)始
                id = ts << (10 + indexBitLength);//騰出后面部分,給實(shí)例編號(hào)和縮引編號(hào)使用

                //增加實(shí)例部分
                id = id | (instanceID << indexBitLength);                //獲取計(jì)數(shù)
                if (timestamp < ts)
                {
                    timestamp = ts;
                    index = 0;
                }                else
                {                    if (index > indexMax)
                    {
                        timestamp++;
                        index = 0;
                    }
                }

                id = id | index;

                index++;
            }            return id;
        }        /// <summary>
        /// 獲取當(dāng)前實(shí)例的時(shí)間戳
        /// </summary>
        public long CurrentTimestamp
        {            get
            {                return this.timestamp;
            }
        }        /// <summary>
        /// 默認(rèn)每實(shí)例每秒生成65536個(gè)ID,從1970年1月1日起,累計(jì)可使用4358年
        /// </summary>
        public static IdCreator Default
        {            get
            {                return _default;
            }
        }
    }

代碼說(shuō)明

使用時(shí),需要new一個(gè)IdCreator的實(shí)例,然後呼叫Create()方法,產(chǎn)生ID號(hào).需要把IdCreator的例實(shí)賦給一個(gè)靜態(tài)變數(shù),以保證ID號(hào)的唯一性.如果是分散式部署,需要給IdCreator的建構(gòu)子傳遞instanceID參數(shù),每一個(gè)部署都要有一個(gè)不同的值,範(fàn)圍為0-1023.

構(gòu)造函數(shù)中的indexBitLength參數(shù),代表圖中最右邊的'序號(hào)'的長(zhǎng)度,不再固定為12bit,範(fàn)圍為1- 32.剩下的可用位,就留給了時(shí)間戳.

注意:IdCreator類的時(shí)間戳是按秒計(jì)的.?如果想改成毫秒,只需要將代碼long ts = Harry.Common.Utils.GetTimeStamp () / 1000;改成long ts = Harry.Common.Utils.GetTimeStamp();即可.

範(fàn)例程式碼

 IdCreator c=new IdCreator(0,16); 
  var id=c.Create();


本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門(mén)話題

Laravel 教程
1600
29
PHP教程
1502
276
c#多線程和異步的區(qū)別 c#多線程和異步的區(qū)別 Apr 03, 2025 pm 02:57 PM

多線程和異步的區(qū)別在於,多線程同時(shí)執(zhí)行多個(gè)線程,而異步在不阻塞當(dāng)前線程的情況下執(zhí)行操作。多線程用於計(jì)算密集型任務(wù),而異步用於用戶交互操作。多線程的優(yōu)勢(shì)是提高計(jì)算性能,異步的優(yōu)勢(shì)是不阻塞 UI 線程。選擇多線程還是異步取決於任務(wù)性質(zhì):計(jì)算密集型任務(wù)使用多線程,與外部資源交互且需要保持 UI 響應(yīng)的任務(wù)使用異步。

C#與C:歷史,進(jìn)化和未來(lái)前景 C#與C:歷史,進(jìn)化和未來(lái)前景 Apr 19, 2025 am 12:07 AM

C#和C 的歷史與演變各有特色,未來(lái)前景也不同。 1.C 由BjarneStroustrup在1983年發(fā)明,旨在將面向?qū)ο缶幊桃隒語(yǔ)言,其演變歷程包括多次標(biāo)準(zhǔn)化,如C 11引入auto關(guān)鍵字和lambda表達(dá)式,C 20引入概念和協(xié)程,未來(lái)將專注於性能和系統(tǒng)級(jí)編程。 2.C#由微軟在2000年發(fā)布,結(jié)合C 和Java的優(yōu)點(diǎn),其演變注重簡(jiǎn)潔性和生產(chǎn)力,如C#2.0引入泛型,C#5.0引入異步編程,未來(lái)將專注於開(kāi)發(fā)者的生產(chǎn)力和雲(yún)計(jì)算。

xml怎麼轉(zhuǎn)換成json xml怎麼轉(zhuǎn)換成json Apr 03, 2025 am 09:09 AM

將 XML 轉(zhuǎn)換為 JSON 的方法包括:使用編程語(yǔ)言(如 Python、Java、C#)編寫(xiě)腳本或程序進(jìn)行轉(zhuǎn)換;使用在線工具(如 XML 轉(zhuǎn)換為 JSON、Gojko's XML 轉(zhuǎn)換器、XML 在線工具)粘貼或上傳 XML 數(shù)據(jù)並選擇 JSON 格式輸出;使用 XML 到 JSON 轉(zhuǎn)換器(如 Oxygen XML Editor、Stylus Studio、Altova XMLSpy)執(zhí)行轉(zhuǎn)換任務(wù);使用 XSLT 樣式表將 XML 轉(zhuǎn)換為 JSON;使用數(shù)據(jù)集成工具(如 Informatic

c#多線程編程是什麼  c#多線程編程用處 c#多線程編程是什麼 c#多線程編程用處 Apr 03, 2025 pm 02:45 PM

C# 多線程編程是一種讓程序同時(shí)執(zhí)行多項(xiàng)任務(wù)的技術(shù),它可以通過(guò)提升性能、提高響應(yīng)能力和實(shí)現(xiàn)並行處理來(lái)提高程序效率。雖然 Thread 類提供了直接創(chuàng)建線程的方法,但 Task 和 async/await 等高級(jí)工具可以提供更安全的異步操作和更簡(jiǎn)潔的代碼結(jié)構(gòu)。多線程編程中常見(jiàn)的難題包括死鎖、競(jìng)態(tài)條件和資源洩漏,需要仔細(xì)設(shè)計(jì)線程模型和使用適當(dāng)?shù)耐綑C(jī)制來(lái)避免這些問(wèn)題。

C#.NET:使用.NET生態(tài)系統(tǒng)構(gòu)建應(yīng)用程序 C#.NET:使用.NET生態(tài)系統(tǒng)構(gòu)建應(yīng)用程序 Apr 27, 2025 am 12:12 AM

如何利用.NET構(gòu)建應(yīng)用?使用.NET構(gòu)建應(yīng)用可以通過(guò)以下步驟實(shí)現(xiàn):1)了解.NET基礎(chǔ)知識(shí),包括C#語(yǔ)言和跨平臺(tái)開(kāi)發(fā)支持;2)學(xué)習(xí)核心概念,如.NET生態(tài)系統(tǒng)的組件和工作原理;3)掌握基本和高級(jí)用法,從簡(jiǎn)單控制臺(tái)應(yīng)用到復(fù)雜的WebAPI和數(shù)據(jù)庫(kù)操作;4)熟悉常見(jiàn)錯(cuò)誤與調(diào)試技巧,如配置和數(shù)據(jù)庫(kù)連接問(wèn)題;5)應(yīng)用性能優(yōu)化與最佳實(shí)踐,如異步編程和緩存。

從網(wǎng)絡(luò)到桌面:C#.NET的多功能性 從網(wǎng)絡(luò)到桌面:C#.NET的多功能性 Apr 15, 2025 am 12:07 AM

C#.NETisversatileforbothwebanddesktopdevelopment.1)Forweb,useASP.NETfordynamicapplications.2)Fordesktop,employWindowsFormsorWPFforrichinterfaces.3)UseXamarinforcross-platformdevelopment,enablingcodesharingacrossWindows,macOS,Linux,andmobiledevices.

.NET框架與C#:解碼術(shù)語(yǔ) .NET框架與C#:解碼術(shù)語(yǔ) Apr 21, 2025 am 12:05 AM

.NETFramework是一個(gè)軟件框架,C#是一種編程語(yǔ)言。 1..NETFramework提供庫(kù)和服務(wù),支持桌面、Web和移動(dòng)應(yīng)用開(kāi)發(fā)。 2.C#設(shè)計(jì)用於.NETFramework,支持現(xiàn)代編程功能。 3..NETFramework通過(guò)CLR管理代碼執(zhí)行,C#代碼編譯成IL後由CLR運(yùn)行。 4.使用.NETFramework可快速開(kāi)發(fā)應(yīng)用,C#提供如LINQ的高級(jí)功能。 5.常見(jiàn)錯(cuò)誤包括類型轉(zhuǎn)換和異步編程死鎖,調(diào)試需用VisualStudio工具。

c#多線程的好處有哪些 c#多線程的好處有哪些 Apr 03, 2025 pm 02:51 PM

多線程的好處在於能提升性能和資源利用率,尤其適用於處理大量數(shù)據(jù)或執(zhí)行耗時(shí)操作。它允許同時(shí)執(zhí)行多個(gè)任務(wù),提高效率。然而,線程過(guò)多會(huì)導(dǎo)致性能下降,因此需要根據(jù) CPU 核心數(shù)和任務(wù)特性謹(jǐn)慎選擇線程數(shù)。另外,多線程編程涉及死鎖和競(jìng)態(tài)條件等挑戰(zhàn),需要使用同步機(jī)制解決,需要具備紮實(shí)的並發(fā)編程知識(shí),權(quán)衡利弊並謹(jǐn)慎使用。

See all articles