

新闻资讯
技术教程C#雪花算法生成64位唯一ID,结构为1位符号位+41位时间戳+10位机器ID+12位序列号;需用Interlocked保证线程安全,处理时钟回拨,并确保workerId全局唯一且在0~1023范围内。
在C#中实现雪花算法(Snowflake ID),核心是按位组装一个64位长整型(long),结构为:1位符号位(固定为0)+ 41位时间戳(毫秒级,起始时间自定义)+ 10位机器ID(支持最多1024个节点)+ 12位序列号(每毫秒内可生成4096个ID)。关键在于线程安全、时钟回拨处理和ID唯一性保障。
64位ID按如下方式划分(从高位到低位):
推荐将 datacenterId 和 workerId 合并为一个 workerId(0~1023),简化部署。位移偏移量通常设为:timestampLeftShift = 22,workerIdLeftShift = 12,sequenceMask = 0xFFF(即4095)。
使用 System.Threading.Interlocked 保证 sequence 和 lastTimestamp 的原子操作,避免锁开销:
private long _sequence = 0 和 private long _lastTimestamp = -1 作为实例字段Interlocked.CompareExchange(ref _lastTimestamp, timestamp, old) 判断是否跨毫秒Interlocked.Increment(ref _sequence) & sequenceMask 获取新序号注意:不要用 lock 或 Monitor,高并发下会成为瓶颈;静态类 + 单例模式更合适,确保每个服务实例有唯一 workerId。
服务器时间向后调整(NTP校准)可能导致重复ID或阻塞。常见策略有:
生产环境建议采用第一种:记录 _lastValidTimestamp,当 current 时抛异常;当 current 但差值≤5ms时,继续用原 timestamp + 递增 sequence。
workerId 必须全局唯一,不能靠随机或进程PID(易冲突)。推荐方式:
WORKER_ID=12)ip.GetHashCode() % 1024),需加防止单点哈希碰撞的兜底逻辑务
必校验 workerId ∈ [0, 1023],越界应启动失败并报错,不静默截断。
基本上就这些。只要注意位运算无误、sequence 原子更新、时间判断严谨、workerId 可控,一个轻量健壮的 Snowflake ID 生成器就完成了。不需要第三方库,.NET Core 3.1+ 原生支持完全足够。