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

简介: 上次简单的说一下:http://www.cnblogs.com/dunitian/p/6041745.html#uid C#版本的国外朋友已经封装了,大家可以去看看:https://github.com/ccollie/snowflake-net 强大的网友出来个简化版本:http://blog.csdn.net/***/article/details/*** (地址我就不贴了,对前辈需要最起码的尊敬) 一开始我用的是这个简化版本,后来发现有重复项。

上次简单的说一下:http://www.cnblogs.com/dunitian/p/6041745.html#uid

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)

 IdWorker.Init().NextId()

作者: 毒逆天
打赏: 18i4JpL6g54yAPAefdtgqwRrZ43YJwAV5z
本文版权归作者和博客园共有。欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文连接!
目录
相关文章
|
存储 算法 Java
雪花算法(snowflake) :分布式环境,生成全局唯一的订单号
雪花算法(snowflake) :分布式环境,生成全局唯一的订单号
1617 0
雪花算法(snowflake) :分布式环境,生成全局唯一的订单号
|
1月前
|
算法 关系型数据库 MySQL
分布式唯一ID生成:深入理解Snowflake算法在Go中的实现
在分布式系统中,确保每个节点生成的 ID 唯一且高效至关重要。Snowflake 算法由 Twitter 开发,通过 64 位 long 型数字生成全局唯一 ID,包括 1 位标识位、41 位时间戳、10 位机器 ID 和 12 位序列号。该算法具备全局唯一性、递增性、高可用性和高性能,适用于高并发场景,如电商促销时的大量订单生成。本文介绍了使用 Go 语言的 `bwmarrin/snowflake` 和 `sony/sonyflake` 库实现 Snowflake 算法的方法。
43 1
分布式唯一ID生成:深入理解Snowflake算法在Go中的实现
|
6月前
|
算法 数据中心 Python
基于python雪花算法工具类Snowflake-来自chatGPT
基于python雪花算法工具类Snowflake-来自chatGPT
132 4
|
6月前
|
算法 PHP 数据中心
基于php雪花算法工具类Snowflake -来自chatGPT
基于php雪花算法工具类Snowflake -来自chatGPT
120 2
|
6月前
|
算法 数据中心 C++
基于C++雪花算法工具类Snowflake -来自chatGPT
基于C++雪花算法工具类Snowflake -来自chatGPT
|
5月前
|
存储 算法 Java
分布式自增ID算法---雪花算法(SnowFlake)Java实现
分布式自增ID算法---雪花算法(SnowFlake)Java实现
302 0
|
7月前
|
缓存 算法 关系型数据库
深度思考:雪花算法snowflake分布式id生成原理详解
雪花算法snowflake是一种优秀的分布式ID生成方案,其优点突出:它能生成全局唯一且递增的ID,确保了数据的一致性和准确性;同时,该算法灵活性强,可自定义各部分bit位,满足不同业务场景的需求;此外,雪花算法生成ID的速度快,效率高,能有效应对高并发场景,是分布式系统中不可或缺的组件。
1751 2
深度思考:雪花算法snowflake分布式id生成原理详解
|
算法 中间件
SnowFlake 雪花算法和原理(分布式 id 生成算法)
SnowFlake 雪花算法和原理(分布式 id 生成算法)
214 0
|
存储 运维 算法
UUID和雪花(Snowflake)算法该如何选择?
UUID和雪花(Snowflake)算法该如何选择?
342 0
|
存储 算法 NoSQL
C# 实现分布式自增 ID 算法(Snowflake 雪花算法)
需求概述分布式系统中,有一些需要使用 `全局唯一 ID` 的场景,这种时候为了防止 `ID` 冲突可以使用 `36` 位的通用唯一识别码/UUID(Universally Unique Identifier),但是 `UUID` 有一些缺点,首先他相对比较长,另外 `UUID` 一般是无序的。有些时候我们希望能使用一种简单一些的 ID,并且希望 ID 能够按照时...
1025 1
C# 实现分布式自增 ID 算法(Snowflake 雪花算法)
下一篇
DataWorks