SnowFlake算法是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。
在多线程环境下多次调用算法中的new Snowflake.IdWorker(1, 1)会导致重复ID的出现,因此在使用该算法生成ID时,为了保证唯一性,需要使用单例模式里确保只会调用一次new Snowflake.IdWorker(1, 1)。
单例模式 防止重复执行new Snowflake.IdWorker(1, 1)造成ID重复的问题
using System;
namespace CSharpSnowFlakeTest
{
public sealed class SnowFlakeSingleTest
{
public static readonly SnowFlakeSingleTest instance = new SnowFlakeSingleTest();
private SnowFlakeSingleTest()
{
worker = new Snowflake.IdWorker(1, 1);
}
static SnowFlakeSingleTest() { }
public static SnowFlakeSingleTest Instance
{
get { return instance; }
}
private Snowflake.IdWorker worker;
public string getID()
{
return worker.NextId().ToString();
}
}
}