欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

关于全局ID,雪花(snowflake)算法的说明

发布时间:2023/12/4 编程问答 41 豆豆
生活随笔 收集整理的这篇文章主要介绍了 关于全局ID,雪花(snowflake)算法的说明 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

C#版本的国外朋友已经封装了,大家可以去看看:https://github.com/ccollie/snowflake-net

强大的网友出来个简化版本:http://blog.csdn.net/***/article/details/*** (地址我就不贴了,对前辈需要最起码的尊敬)

一开始我用的是这个简化版本,后来发现有重复项。。。(demo:https://github.com/dunitian/TempCode/tree/master/2016-11-16/Twitter_Snowflake)

全局ID的激烈讨论:https://q.cnblogs.com/q/53552/

之后在外国大牛的基础上重写修改了部分内容(https://github.com/ccollie/snowflake-net),添加了一些注解等【支持Core】。现在是可以去Nuget直接下载使用的:Snowflake.Net

源码地址:https://github.com/dunitian/snowflake-net

测试用例:

测试代码: 


using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Snowflake.Net; namespace Snowflake.ZConsole {      class Program      {          private static int N = 2000000;          private static HashSet< long > set = new HashSet< long >();          private static IdWorker worker = new IdWorker(1, 1);          private static int taskCount = 0;          static void Main( string [] args)          {              Task.Run(() => GetID());              Task.Run(() => GetID());              Task.Run(() => GetID());              Task.Run(() => Printf());              Console.ReadKey();          }          private static void Printf()          {              while (taskCount != 3)              {                  Console.WriteLine( "..." );                  Thread.Sleep(1000);              }              Console.WriteLine( set .Count == N * taskCount);          }          private static object o = new object ();          private static void GetID()          {              for ( var i = 0; i < N; i++)              {                  var id = worker.NextId();                  lock (o)                  {                      if ( set .Contains(id))                      {                          Console.WriteLine( "发现重复项 : {0}" , id);                      }                      else                      {                          set .Add(id);                      }                  }              }              Console.WriteLine($ "任务{++taskCount}完成" );          }      } }

  

可能有些人只关心以后怎么用?==》

IdWorker worker = new IdWorker(1, 1); //大并发的情况下,减少new的次数可以有效避免重复的可能

var id = worker.NextId();

有可能上面的减少new有些同志不太懂,(⊙o⊙)…,举个例子:

测试代码不变的情况下,改这么一句:

 

完整调用demo:(https://github.com/dunitian/snowflake-net/tree/master/Demo)

 core:(https://github.com/dunitian/snowflake-net/tree/master/Demo.Core)

原文地址:http://www.cnblogs.com/dunitian/p/6130543.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

总结

以上是生活随笔为你收集整理的关于全局ID,雪花(snowflake)算法的说明的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。