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

Rumah 類庫下載 C#類庫 c#分布式ID生成器

c#分布式ID生成器

Nov 04, 2016 pm 04:48 PM
c#

簡介

這個是根據(jù)twitter的snowflake來寫的.這里有中文的介紹.

c83d70cf3bc79f3df9126e80bba1cd11738b298a.jpg


如上圖所示,一個64位ID,除了最左邊的符號位不用(固定為0,以保證生成的ID都是正數(shù)),還剩余63位可用.

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

代碼

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

        }        /// <summary>
        /// 默認(rèn)每秒生成65536個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)
            {                //增加時間戳部分
                long ts = Harry.Common.Utils.GetTimeStamp() / 1000;

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

                //增加實(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í)例的時間戳
        /// </summary>
        public long CurrentTimestamp
        {            get
            {                return this.timestamp;
            }
        }        /// <summary>
        /// 默認(rèn)每實(shí)例每秒生成65536個ID,從1970年1月1日起,累計(jì)可使用4358年
        /// </summary>
        public static IdCreator Default
        {            get
            {                return _default;
            }
        }
    }

代碼說明

使用時,需要new一個IdCreator的實(shí)例,然后調(diào)用Create()方法,生成一個ID號.需要把IdCreator的例實(shí)賦給一個靜態(tài)變量,以保證ID號的唯一性.如果是分布式部署,需要給IdCreator的構(gòu)造函數(shù)傳遞instanceID參數(shù),每一個部署都要有一個不同的值,范圍為0-1023.

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

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

示例代碼

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


Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial PHP
1502
276
Perbezaan antara multithreading dan asynchronous C# Perbezaan antara multithreading dan asynchronous C# Apr 03, 2025 pm 02:57 PM

Perbezaan antara multithreading dan asynchronous adalah bahawa multithreading melaksanakan pelbagai benang pada masa yang sama, sementara secara tidak sengaja melakukan operasi tanpa menyekat benang semasa. Multithreading digunakan untuk tugas-tugas yang berintensifkan, sementara asynchronously digunakan untuk interaksi pengguna. Kelebihan multi-threading adalah untuk meningkatkan prestasi pengkomputeran, sementara kelebihan asynchronous adalah untuk tidak menghalang benang UI. Memilih multithreading atau asynchronous bergantung kepada sifat tugas: tugas-tugas intensif pengiraan menggunakan multithreading, tugas yang berinteraksi dengan sumber luaran dan perlu menyimpan respons UI menggunakan asynchronous.

C# vs C: Sejarah, evolusi, dan prospek masa depan C# vs C: Sejarah, evolusi, dan prospek masa depan Apr 19, 2025 am 12:07 AM

Sejarah dan evolusi C# dan C adalah unik, dan prospek masa depan juga berbeza. 1.C dicipta oleh BjarnestroustRup pada tahun 1983 untuk memperkenalkan pengaturcaraan berorientasikan objek ke dalam bahasa C. Proses evolusinya termasuk pelbagai standardisasi, seperti C 11 memperkenalkan kata kunci auto dan ekspresi Lambda, C 20 memperkenalkan konsep dan coroutin, dan akan memberi tumpuan kepada pengaturcaraan prestasi dan sistem pada masa akan datang. 2.C# telah dikeluarkan oleh Microsoft pada tahun 2000. Menggabungkan kelebihan C dan Java, evolusinya memberi tumpuan kepada kesederhanaan dan produktiviti. Sebagai contoh, C#2.0 memperkenalkan generik dan C#5.0 memperkenalkan pengaturcaraan tak segerak, yang akan memberi tumpuan kepada produktiviti pemaju dan pengkomputeran awan pada masa akan datang.

Cara menukar XML ke JSON Cara menukar XML ke JSON Apr 03, 2025 am 09:09 AM

Kaedah untuk menukar XML ke JSON termasuk: menulis skrip atau program dalam bahasa pengaturcaraan (seperti Python, Java, C#) untuk menukar; Menyisipkan atau memuat naik data XML menggunakan alat dalam talian (seperti XML ke JSON, penukar XML Gojko, alat dalam talian XML) dan memilih output format JSON; Melaksanakan tugas penukaran menggunakan XML kepada penukar JSON (seperti editor XML oksigen, Stylus Studio, ALTOVA XMLSPY); Menukar XML ke JSON menggunakan XSLT Stylesheets; Menggunakan alat integrasi data (seperti Informatic

Apakah pengaturcaraan C# multithreading? C# Pemrograman Multithreading Menggunakan C Apakah pengaturcaraan C# multithreading? C# Pemrograman Multithreading Menggunakan C Apr 03, 2025 pm 02:45 PM

C Ia dapat meningkatkan kecekapan program dengan meningkatkan prestasi, meningkatkan respons dan melaksanakan pemprosesan selari. Walaupun kelas thread menyediakan cara untuk membuat benang secara langsung, alat lanjutan seperti tugas dan async/menunggu dapat memberikan operasi tak segerak yang lebih selamat dan struktur kod yang bersih. Cabaran umum dalam pengaturcaraan multithread termasuk kebuntuan, keadaan kaum, dan kebocoran sumber, yang memerlukan reka bentuk yang teliti model threading dan penggunaan mekanisme penyegerakan yang sesuai untuk mengelakkan masalah ini.

C# .NET: Membina aplikasi dengan ekosistem .NET C# .NET: Membina aplikasi dengan ekosistem .NET Apr 27, 2025 am 12:12 AM

Bagaimana Membina Aplikasi Menggunakan .NET? Membina aplikasi menggunakan .NET boleh dicapai melalui langkah-langkah berikut: 1) Memahami asas-asas .NET, termasuk C# bahasa dan sokongan pembangunan silang platform; 2) mempelajari konsep teras seperti komponen dan prinsip kerja ekosistem .NET; 3) menguasai penggunaan asas dan lanjutan, dari aplikasi konsol mudah ke operasi WebAPIS dan pangkalan data yang kompleks; 4) terbiasa dengan kesilapan biasa dan teknik debugging, seperti konfigurasi dan isu sambungan pangkalan data; 5) Pengoptimuman prestasi aplikasi dan amalan terbaik, seperti pengaturcaraan dan caching asynchronous.

Dari web ke desktop: fleksibiliti C# .net Dari web ke desktop: fleksibiliti C# .net Apr 15, 2025 am 12:07 AM

C#.netisversatileforbothwebanddesktopdevelopment.1) Forweb, useasp.netfordynamicapplications.2) Fordesktop, ExployWindowsFormsor Wpfforrichinterfaces.3) UseXamarinforcross-platformdevelopment, enablingcodesharingacrosswindows, macOS, linux, andmobiledevices.

Rangka Kerja .NET vs C#: Menyahkodkan istilah Rangka Kerja .NET vs C#: Menyahkodkan istilah Apr 21, 2025 am 12:05 AM

.NetFramework adalah kerangka perisian, dan C# adalah bahasa pengaturcaraan. 1..NetFramework menyediakan perpustakaan dan perkhidmatan, sokongan desktop, web dan aplikasi mudah alih. 2.C# direka untuk .NetFramework dan menyokong fungsi pengaturcaraan moden. 3..NetFramework Menguruskan pelaksanaan kod melalui CLR, dan kod C# disusun ke IL dan dikendalikan oleh CLR. 4. Gunakan .NetFramework untuk membangunkan aplikasi dengan cepat, dan C# menyediakan fungsi lanjutan seperti LINQ. 5. Kesilapan umum termasuk penukaran jenis dan kebuntuan pengaturcaraan tak segerak. Alat VisualStudio diperlukan untuk debugging.

Apakah faedah multithreading dalam C#? Apakah faedah multithreading dalam C#? Apr 03, 2025 pm 02:51 PM

Kelebihan multithreading ialah ia dapat meningkatkan prestasi dan penggunaan sumber, terutamanya untuk memproses sejumlah besar data atau melakukan operasi yang memakan masa. Ia membolehkan pelbagai tugas dilakukan secara serentak, meningkatkan kecekapan. Walau bagaimanapun, terlalu banyak benang boleh menyebabkan kemerosotan prestasi, jadi anda perlu dengan teliti memilih bilangan benang berdasarkan bilangan teras CPU dan ciri -ciri tugas. Di samping itu, pengaturcaraan multi-threaded melibatkan cabaran seperti kebuntuan dan keadaan perlumbaan, yang perlu diselesaikan menggunakan mekanisme penyegerakan, dan memerlukan pengetahuan yang kukuh tentang pengaturcaraan serentak, menimbang kebaikan dan keburukan dan menggunakannya dengan berhati-hati.

See all articles