首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

高併發場景下的 C# 數字型唯一 ID 生成器

     編輯:關於C#

設計目標

  • 單機高併發下生成唯一 ID
  • 長度適合 SQL Server decimal(29) / C# decimal(29 位)
  • 無需協調中心,本地即可生成

生成策略

ID = 時間戳(yyyyMMddHHmmssff) + 機器 IP 後兩段 + 3位序列號

  • 時間戳:17 位(年月日時分秒毫秒)
  • IP:取後 16 位(如 192.168.1.21 → 168010021)
  • 序列號:同毫秒內遞增 1~999 循環

實現代碼

public static class UniqueIdGenerator {
    private static readonly long _ipSuffix;
    private static int _seq = 1;
    private static readonly object _lock = new();

    static UniqueIdGenerator() {
        // 實際應從配置讀取
        _ipSuffix = IP2Long("192.168.1.21") & 0xFFFF; // 取後 16 位
    }

    public static decimal Next() {
        string timePart = DateTime.Now.ToString("yyyyMMddHHmmssff");
        int seq;
        lock (_lock) {
            if (_seq > 999) _seq = 1;
            seq = _seq++;
        }
        return decimal.Parse($"{timePart}{_ipSuffix:D8}{seq:D3}");
    }

    private static long IP2Long(string ip) {
        var parts = ip.Split('.').Select(long.Parse).ToArray();
        return (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8) | parts[3];
    }
}

壓測結果

10 萬次調用耗時 < 0.5 秒,滿足高併發需求。

優缺點與改進

  • ✅ 簡單、無依賴、有序(按時間)
  • ⚠️ 依賴系統時鐘,若回撥會重複(可引入時鐘回撥檢測)
  • ⚠️ 單機每毫秒上限 999 個,極高併發需擴展序列位或引入隨機數
  • 💡 生產環境建議採用 Snowflake 算法(41bit 時間 + 10bit 機器 + 12bit 序列)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved