簡介
這個是根據(jù)twitter的snowflake來寫的.這里有中文的介紹.
如上圖所示,一個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('1', 53 - indexBitLength), 2); indexMax = Convert.ToInt64(new string('1', 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();

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

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

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

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.

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.

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

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.

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.

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

.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.

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.
