117.info
人生若只如初见

如何用C#生成唯一的Snowflake ID

Snowflake ID 是一种分布式系统中生成唯一 ID 的算法,由 Twitter 开源。它可以在不依赖数据库或其他存储设备的情况下生成全局唯一的 ID。Snowflake ID 通常是一个 64 位的整数,由以下部分组成:

  1. 前 1 位未使用,任意填充。
  2. 41 位表示时间戳。
  3. 10 位表示工作机器 ID,可通过部署多个 Snowflake 服务。
  4. 12 位序列号,单节点每毫秒内可以生成 4096 个 ID。

以下是一个简单的 C# 实现:

using System;
using System.Threading;

public class SnowflakeIdWorker
{
    private const long Twepoch = 1288834974657L;
    private const int WorkerIdBits = 10;
    private const int SequenceBits = 12;
    private const long MaxWorkerId = -1L ^ (-1L<< WorkerIdBits);
    private const long SequenceMask = -1L ^ (-1L << SequenceBits);

    private static readonly object SyncRoot = new object();
    private readonly long _workerId;
    private long _sequence;
    private long _lastTimestamp;

    public SnowflakeIdWorker(long workerId)
    {
        if (workerId > MaxWorkerId || workerId < 0)
            throw new ArgumentException($"Worker Id can't be greater than {MaxWorkerId} or less than 0");

        _workerId = workerId;
    }

    public long NextId()
    {
        lock (SyncRoot)
        {
            var timestamp = TimeGen();

            if (timestamp < _lastTimestamp)
                throw new Exception($"Invalid system clock! Refusing to generate id for {_lastTimestamp - timestamp} milliseconds");

            if (_lastTimestamp == timestamp)
            {
                _sequence = (_sequence + 1) & SequenceMask;
                if (_sequence == 0) timestamp = TilNextMillis(_lastTimestamp);
            }
            else
            {
                _sequence = 0;
            }

            _lastTimestamp = timestamp;
            var id = ((timestamp - Twepoch) << (WorkerIdBits + SequenceBits)) | (_workerId << SequenceBits) | _sequence;

            return id;
        }
    }

    protected virtual long TilNextMillis(long lastTimestamp)
    {
        var timestamp = TimeGen();
        while (timestamp <= lastTimestamp) timestamp = TimeGen();
        return timestamp;
    }

    protected virtual long TimeGen()
    {
        return DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
    }
}

要使用此类生成 Snowflake ID,请创建一个 SnowflakeIdWorker 实例并调用 NextId() 方法。例如:

var worker = new SnowflakeIdWorker(1); // Use worker ID 1
var id = worker.NextId();
Console.WriteLine("Generated Snowflake ID: " + id);

注意:这个实现不是线程安全的,如果需要在多线程环境中使用,请确保对 NextId() 方法进行适当的同步。在上面的代码中,我们使用了 lock 关键字来实现同步。

未经允许不得转载 » 本文链接:https://www.117.info/ask/fe5e5AzsBAQ5XAg.html

推荐文章

  • C#屏幕拷贝操作详解

    在C#中,要实现屏幕拷贝(即截图)操作,可以使用System.Drawing命名空间中的Graphics和Bitmap类 首先,引入必要的命名空间: using System.Drawing;
    using...

  • C#中CopyFromScreen的应用场景

    CopyFromScreen 是 C# 中 Graphics 类的一个方法,它用于从屏幕上复制一个矩形区域到一个位图(Bitmap)对象 截图:CopyFromScreen 可以用来捕获屏幕上的特定区域...

  • 如何用C#截取整个屏幕

    要使用C#截取整个屏幕,你可以使用System.Drawing和System.Windows.Forms命名空间中的类
    using System;
    using System.Drawing;
    using System.Win...

  • C# CopyFromScreen技巧分享

    CopyFromScreen 是一个非常有用的方法,它可以将屏幕上的某个区域复制到一个 Bitmap 对象中。这在创建屏幕截图、录制屏幕或进行自动化测试时非常有用。以下是一些...

  • C# Snowflake算法优化技巧

    Snowflake 算法是一种分布式 ID 生成策略,用于在分布式系统中生成全局唯一的 ID。它的优点是生成的 ID 是递增的,且不依赖于数据库或其他存储设备。以下是一些 ...

  • Snowflake在C#中的应用场景有哪些

    在C#中,Snowflake是一种分布式ID生成算法,它可以在不依赖数据库或其他存储设备的情况下生成全局唯一的ID。以下是Snowflake在C#中的一些应用场景: 数据库主键生...

  • C#如何实现Snowflake算法

    Snowflake 是 Twitter 开源的分布式 ID 生成算法,它可以在不依赖数据库的情况下生成全局唯一的 ID。下面是一个简单的 C# 实现:
    using System; public cla...

  • SQL教程中如何应对复杂查询挑战

    在SQL教程中,应对复杂查询挑战的方法有很多。以下是一些建议: 分解问题:将复杂查询分解成更小、更容易管理的部分。这有助于识别所需的数据表、字段和连接条件...