C# 版 雪花ID
发布人:shili8
发布时间:2024-02-11 18:47
阅读次数:88
在分布式系统中,生成唯一的ID是非常重要的。雪花算法是一种生成全局唯一ID的算法,它可以在分布式系统中生成唯一的ID,避免重复。
下面是一个C#版本的雪花ID生成器的示例代码:
csharpusing System;
public class SnowflakeIdGenerator{
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 readonly object _lock = new object();
private long _lastTimestamp = -1L;
private long _sequence =0L;
public long WorkerId { get; }
public long DatacenterId { get; }
public SnowflakeIdGenerator(long workerId, long datacenterId)
{
if (workerId > MaxWorkerId || workerId <0)
{
throw new ArgumentException($"Worker ID must be between0 and {MaxWorkerId}");
}
if (datacenterId > MaxDatacenterId || datacenterId <0)
{
throw new ArgumentException($"Datacenter ID must be between0 and {MaxDatacenterId}");
}
WorkerId = workerId;
DatacenterId = datacenterId;
}
public long NextId()
{
lock (_lock)
{
long timestamp = GetCurrentTimestamp();
if (timestamp < _lastTimestamp)
{
throw new Exception("Clock moved backwards. Refusing to generate ID");
}
if (timestamp == _lastTimestamp)
{
_sequence = (_sequence +1) & SequenceMask;
if (_sequence ==0)
{
timestamp = WaitNextMillis(timestamp);
}
}
else {
_sequence =0;
}
_lastTimestamp = timestamp;
return ((timestamp - Twepoch) << TimestampLeftShift)
| (DatacenterId << DatacenterIdShift)
| (WorkerId << WorkerIdShift)
| _sequence;
}
}
private long GetCurrentTimestamp()
{
return (long)(DateTime.UtcNow - new DateTime(1970,1,1)).TotalMilliseconds;
}
private long WaitNextMillis(long lastTimestamp)
{
long timestamp = GetCurrentTimestamp();
while (timestamp <= lastTimestamp)
{
timestamp = GetCurrentTimestamp();
}
return timestamp;
}
}
在上面的代码中,我们定义了一个SnowflakeIdGenerator类,它包含了生成雪花ID的逻辑。我们可以通过调用NextId方法来获取一个唯一的ID。
使用示例:
csharpvar generator = new SnowflakeIdGenerator(1,1);
var id = generator.NextId();
Console.WriteLine($"Generated ID: {id}");
通过使用这个C#版本的雪花ID生成器,我们可以在分布式系统中生成唯一的ID,确保数据的唯一性和一致性。

