前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【愚公系列】2023年10月 .NET CORE工具案例-DeveloperSharp(分布式唯一Id)

【愚公系列】2023年10月 .NET CORE工具案例-DeveloperSharp(分布式唯一Id)

作者头像
愚公搬代码
发布2025-06-02 13:31:22
发布2025-06-02 13:31:22
9200
代码可运行
举报
文章被收录于专栏:历史专栏历史专栏
运行总次数:0
代码可运行

🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。 🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。 🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。 🏆🎉欢迎 👍点赞✍评论⭐收藏

🚀前言

分布式唯一ID(Distributed Unique ID,简称DUID)是指在分布式系统中,为了避免ID冲突而使用的一种ID生成方式。

在分布式系统中,多个节点同时生成ID,如果采用单机自增序列的方式,容易造成ID重复的问题。为了解决这个问题,产生了DUID的概念。

常见的DUID生成方式有:

  1. UUID:通用唯一识别码,是一种由网络软件使用的标准,用于标识信息的唯一性。UUID是根据时间戳、硬件设备等多个因素生成的,因此非常难以重复。
  2. Snowflake算法:是Twitter公司开源的一种分布式ID生成算法。Snowflake算法生成的ID是一个64位整数,其中42位表示时间戳,10位表示工作机器ID,12位表示序列号。这种方式可以在分布式系统中保证ID的唯一性。
  3. GUID:全局唯一标识符,是由Microsoft定义的一种生成唯一ID的算法。与UUID类似,GUID也是根据多种参数生成的,具有很高的唯一性。

本文主要介绍DeveloperSharp的使用,DeveloperSharp是一个研发中大型项目必备的系统平台,也是一个低代码平台。

它主要包括了如下一些功能:

  • 基于Sql语句、存储过程、事务、分页的数据库操作。并几乎支持市面上所有种类的数据库。
  • 图片操作。裁剪、缩放、加水印。
  • http请求调用(Post与Get)
  • 高效分页
  • Web服务/WebApi的负载均衡
  • 数据库的负载均衡,以及读写分离
  • CORS跨域访问
  • UUID全球通用唯一识别码
  • MQ消息队列(请另行使用DeveloperSharp.RabbitMQ包)
  • Redis缓存(请另行使用DeveloperSharp.Redis包)
  • “异种数据库”的负载均衡
  • 其他相关功能

🚀一、分布式唯一Id

🔎1.安装包

代码语言:javascript
代码运行次数:0
运行
复制
DeveloperSharp

🔎2.使用

1、WEB项目

代码语言:javascript
代码运行次数:0
运行
复制
using DeveloperSharp.Framework.CoreUtility; //从NuGet引用DeveloperSharp包
--------------------------

//首先在Startup.cs或Program.cs文件中进行工具预载
Services.AddTransient<IUtility, Utility>();
--------------------------

//IU是在相关文件中,通过依赖注入方式获取的IUtility类型对象
var Id = IU.GenerateId("Order");//产生分布式唯一Id

2.控制台项目

代码语言:javascript
代码运行次数:0
运行
复制
using DeveloperSharp.Framework.CoreUtility;//从NuGet引用DeveloperSharp包
------------------------

IUtility IU = new Utility();
var Id = IU.GenerateId("Order");//产生分布式唯一Id

🔎3.自定义雪花算法

以下是一个基于C#的雪花算法ID生成器示例代码:

代码语言:javascript
代码运行次数:0
运行
复制
public class SnowflakeIdGenerator
{
    private static readonly long twepoch = 1288834974657L;
    private static readonly long workerIdBits = 5L;
    private static readonly long datacenterIdBits = 5L;
    private static readonly long maxWorkerId = -1L ^ (-1L << (int)workerIdBits);
    private static readonly long maxDatacenterId = -1L ^ (-1L << (int)datacenterIdBits);
    private static readonly long sequenceBits = 12L;

    private static readonly long workerIdShift = sequenceBits;
    private static readonly long datacenterIdShift = sequenceBits + workerIdBits;
    private static readonly long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
    private static readonly long sequenceMask = -1L ^ (-1L << (int)sequenceBits);

    private static readonly Random random = new Random();

    private readonly long workerId;
    private readonly long datacenterId;
    private long lastTimestamp = -1L;
    private long sequence;

    public SnowflakeIdGenerator(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");
        }

        this.workerId = workerId;
        this.datacenterId = datacenterId;
    }

    public long NextId()
    {
        lock (this)
        {
            long timestamp = GetTimestamp();
            if (timestamp < lastTimestamp)
            {
                throw new Exception($"clock moved backwards.  Refusing to generate id for {lastTimestamp - timestamp} milliseconds");
            }
            if (lastTimestamp == timestamp)
            {
                sequence = (sequence + 1) & sequenceMask;
                if (sequence == 0)
                {
                    timestamp = TilNextMillis(lastTimestamp);
                }
            }
            else
            {
                sequence = random.Next(1, 10);
            }

            lastTimestamp = timestamp;

            return ((timestamp - twepoch) << (int)timestampLeftShift) |
                    (datacenterId << (int)datacenterIdShift) |
                    (workerId << (int)workerIdShift) |
                    sequence;
        }
    }

    private long TilNextMillis(long lastTimestamp)
    {
        long timestamp = GetTimestamp();
        while (timestamp <= lastTimestamp)
        {
            timestamp = GetTimestamp();
        }
        return timestamp;
    }

    private static long GetTimestamp()
    {
        return (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
    }
}

使用方法:

代码语言:javascript
代码运行次数:0
运行
复制
static void Main(string[] args)
{
    SnowflakeIdGenerator generator = new SnowflakeIdGenerator(1, 1);
    long id = generator.NextId();
    Console.WriteLine(id);
}

这样就可以生成一个雪花算法生成的唯一ID了。


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🚀前言
  • 🚀一、分布式唯一Id
    • 🔎1.安装包
    • 🔎2.使用
    • 🔎3.自定义雪花算法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档