分享好友 物流大全首页 物流大全分类 切换频道

吉日象物流货运网

C# Snowflake算法的源码解析

2024-09-305550

Snowflake 算法是 Twitter 开源的一种分布式 ID 生成策略,它可以在不依赖数据库或其他存储设备的情况下生成全局唯一的 ID。Snowflake 算法的 ID 结构包括时间戳、数据中心 ID、机器 ID 和序列号等部分。

以下是一个简单的 C# 实现 Snowflake 算法的示例代码:

using System;using System.Threading;public class Snowflake{    private const long Twepoch = 1288834974657L;    private const int WorkerIdBits = 5;    private const int DatacenterIdBits = 5;    private const int SequenceBits = 12;    private const long MaxWorkerId = -1L ^ (-1L<< WorkerIdBits);    private const long MaxDatacenterId = -1L ^ (-1L<< DatacenterIdBits);    private const int WorkerIdShift = SequenceBits;    private const int DatacenterIdShift = SequenceBits + WorkerIdBits;    private const int TimestampLeftShift = SequenceBits + WorkerIdBits + DatacenterIdBits;    private const long SequenceMask = -1L ^ (-1L << SequenceBits);    private static long _sequence = 0L;    private static long _lastTimestamp = -1L;    private readonly long _workerId;    private readonly long _datacenterId;    private readonly object _lock = new object();    public Snowflake(long workerId, long datacenterId)    {        if (workerId > MaxWorkerId || workerId < 0)        {            throw new ArgumentException($"Worker Id can't be greater than {MaxWorkerId} or less than 0");        }        if (datacenterId > MaxDatacenterId || datacenterId < 0)        {            throw new ArgumentException($"Datacenter Id can't be greater than {MaxDatacenterId} or less than 0");        }        _workerId = workerId;        _datacenterId = datacenterId;    }    public long NextId()    {        lock (_lock)        {            var timestamp = GetCurrentTimestamp();            if (timestamp > _lastTimestamp)            {                _sequence = 0;                _lastTimestamp = timestamp;            }            else            {                _sequence = (_sequence + 1) & SequenceMask;                if (_sequence == 0)                {                    timestamp = WaitNextMillis(_lastTimestamp);                    _lastTimestamp = timestamp;                }            }            return ((timestamp - Twepoch)<< TimestampLeftShift) |                   (_datacenterId<< DatacenterIdShift) |                   (_workerId<< WorkerIdShift) |                   _sequence;        }    }    private long GetCurrentTimestamp()    {        return (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;    }    private long WaitNextMillis(long lastTimestamp)    {        var timestamp = GetCurrentTimestamp();        while (timestamp <= lastTimestamp)        {            Thread.Sleep(1);            timestamp = GetCurrentTimestamp();        }        return timestamp;    }}

这个实现中,我们定义了一个 Snowflake 类,它包含了 Twepoch、WorkerIdBits、DatacenterIdBits、SequenceBits 等常量,用于计算 ID 的各个部分。同时,我们还定义了一些私有变量,如 _sequence、_lastTimestamp、_workerId 和 _datacenterId,用于存储当前的序列号、最后一次生成 ID 的时间戳、工作节点 ID 和数据中心 ID。

Snowflake 类的构造函数接收两个参数,分别是工作节点 ID 和数据中心 ID,并进行合法性检查。NextId 方法用于生成下一个 ID,它首先获取当前的时间戳,然后根据时间戳、工作节点 ID、数据中心 ID 和序列号计算出一个新的 ID。如果当前时间戳小于上一次生成 ID 的时间戳,说明系统时钟回拨,此时需要等待下一毫秒再生成 ID。

GetCurrentTimestamp 方法用于获取当前的时间戳(毫秒级),WaitNextMillis 方法用于等待下一毫秒。

这个实现是线程安全的,因为我们使用了 lock 关键字来确保在生成 ID 时不会被其他线程打断。

举报
打赏
打赏主播是什么意思
打赏主播是指观众(用户)在观看网络直播节目时,自愿通过直播平台提供的支付渠道,将一定数额的金钱或虚拟礼物赠送给主播的行为

0评论2025-03-26878

主打是什么意思
“主打” 这个词常见的有以下几种意思:一、在商业、产品领域主要营销、重点推广当我们说某产品是公司的 “主打产品” 时,是指

0评论2025-03-26644

电台路是什么意思
“电台路” 通常是因与电台相关的因素而得名的道路,以下是一些具体例子:上海电台路:位于宝山区顾村镇,呈南北走向,南起宝安

0评论2025-03-26340

打狙的窍门是什么意思
“打狙的窍门” 通常是指在射击游戏或实际射击场景中,使用狙击步枪时能够提高射击准确性、效率和生存能力等的一些技巧和方法。

0评论2025-03-26654

路上的创作原声是什么意思
“路上的创作原声” 通常是指以 “在路上” 的状态、经历、感悟等为主题或灵感来源而创作的原始声音作品,在不同艺术领域有不同

0评论2025-03-26383

打印照片回执是什么意思
打印照片回执是指在完成照片拍摄并经相关系统审核通过后,将记录照片合格信息以及个人身份等相关内容的电子凭证,通过打印机输出

0评论2025-03-26295

棒打鸳鸯是什么意思
“棒打鸳鸯” 是一个汉语成语,意思是用木棒打散一对鸳鸯,比喻拆散恩爱的夫妻或情侣。该成语的来源和用法如下:来源与出处:出

0评论2025-03-26672

主打三棺是什么意思
“主打三棺” 是一种网络用语,用反语的方式讽刺人们没有正常的思维观念和底线。该梗起源于贴吧网友之间的讽刺话语,具体出自抗

0评论2025-03-26223

常用香料是什么意思
常用香料是指在烹饪、食品加工、香水制作、药品生产等领域中经常使用的具有独特香气和味道的物质。它们可以增添风味、改善气味、

0评论2025-03-26975

潮汕话香芋是什么意思
在潮汕话中,“香芋” 通常指的就是芋头。不过,潮汕方言中芋头的发音是 “麦筲”(mài shāo)。芋头在潮汕地区的饮食文化和民

0评论2025-03-26504

关于我们  |  网站留言
(c)2026 吉日象物流货运网-大件运输货运平台 www.mykuaidi.com