分享程式代碼相關筆記
目前文章總數:157 篇
最後更新:2024年 12月 07日
使用了63bit
關鍵點:每次為了取得唯一值,需要搭配 TimeStamp (微秒) + MacAddress (自增序號為高併發時,最大可容納數)
12 bit 允許範圍: 0~4095
SnowFlake主程式 : SnowFlakeAlg
SnowFlake產生ID的Mathod: SnowFlakeAlg.Method
執行100次顯示
private void Form1_Load(object sender, EventArgs e)
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine(SnowFlakeAlg.GetGuid());
}
}
用一個Lock 確保產生的Id 是遞增的,如果在相同微秒下,已經用完了4095個序號,則會強制換下一微秒
/// <summary>
/// 分布式自增演算法 - 產生唯一ID
/// </summary>
public static partial class SnowFlakeAlg
{
/// <summary>
/// 鎖住的資源對象
/// </summary>
private static object lockItem = new object();
/// <summary>
/// 上一個時間戳- 進行比較用
/// </summary>
private static long lastDateTimeStamp = 0L;
/// <summary>
/// Sequence 序列號 允許0~4095
/// </summary>
private static long sequence = 0L;
public static long GetGuid()
{
//非同步情況下,使用Lock 確保產生唯一ID
lock(lockItem)
{
long result = 0L;
//1. 41bit
long timelong = SnowFlakeAlg.GetTimeSpan.GetTimeSpanReturnLong();
//2. 10bit
long macSn = SnowFlakeAlg.GetMacAddress.GetTenBitMacAddress();
//3. 12bit
sequence++;
//seq == 0 表示 同一秒內已經被排了4095次,Seq 已經用盡,切換至下一秒
if (timelong == lastDateTimeStamp)
{
if (true == SnowFlakeAlg.GetSequence.checkSeq(sequence))
{
//取得下一微秒的Long值
timelong = SnowFlakeAlg.GetTimeSpan.GetTimeSpanReturnNextSecondLong();
}
}
else//不同微秒下
{
sequence = 0;//歸0
}
//紀錄本次的TimeStamp
lastDateTimeStamp = timelong;
//41bit
result =((timelong) << 22) | macSn << 12 | sequence;
return result;
}
}
}
自增的唯一ID
Twitter Blog 連結:https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake.html