日韩欧美国产精品免费一二-日韩欧美国产精品亚洲二区-日韩欧美国产精品专区-日韩欧美国产另-日韩欧美国产免费看-日韩欧美国产免费看清风阁

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

C#生成唯一ID的幾種方式

admin
2024年11月15日 20:57 本文熱度 386
唯一ID是我們在編碼的時候經常需要解決的需求。以下是幾種常見的 ID 生成方式的實現示例:

1. 基于 Snowflake 算法的 ID 生成器
Snowflake 是 Twitter 開源的分布式 ID 生成算法,生成的是一個 64 位的整數 ID。
using System;using System.Threading;
public class SnowflakeIdGenerator{    private const int TimestampBits = 41;    private const int MachineIdBits = 10;    private const int SequenceBits = 12;
    private const long MaxMachineId = (1L << MachineIdBits) - 1;    private const long MaxSequence = (1L << SequenceBits) - 1;
    private static readonly DateTime Epoch = new DateTime(202311000, DateTimeKind.Utc);
    private readonly long _machineId;    private long _sequence = 0L;    private long _lastTimestamp = -1L;
    private readonly object _lock = new object();
    public SnowflakeIdGenerator(long machineId)    {        if (machineId < 0 || machineId > MaxMachineId)            throw new ArgumentException($"Machine ID must be between 0 and {MaxMachineId}.");
        _machineId = machineId;    }
    public long GenerateId()    {        lock (_lock)        {            long timestamp = GetCurrentTimestamp();
            if (timestamp < _lastTimestamp)                throw new InvalidOperationException("Clock moved backwards.");
            if (timestamp == _lastTimestamp)            {                _sequence = (_sequence + 1) & MaxSequence;                if (_sequence == 0)                    timestamp = WaitNextMillis(_lastTimestamp);            }            else            {                _sequence = 0L;            }
            _lastTimestamp = timestamp;
            return (timestamp << (MachineIdBits + SequenceBits))                   | (_machineId << SequenceBits)                   | _sequence;        }    }
    private long GetCurrentTimestamp()    {        return (long)(DateTime.UtcNow - Epoch).TotalMilliseconds;    }
    private long WaitNextMillis(long lastTimestamp)    {        long timestamp = GetCurrentTimestamp();        while (timestamp <= lastTimestamp)        {            timestamp = GetCurrentTimestamp();        }        return timestamp;    }}
// 使用示例var generator = new SnowflakeIdGenerator(1); // 傳入機器 IDlong id = generator.GenerateId();Console.WriteLine(id); // 輸出一個 64 位整數

  • 優點:高性能,支持分布式。生成的 ID 有序。
  • 缺點:需要配置機器 ID。


2. 基于時間戳和隨機數的 ID 生成器
結合時間戳和隨機數生成 ID,適合簡單場景。
using System;
public class TimestampIdGenerator{    private static readonly Random Random = new Random();
    public string GenerateId(string prefix = "")    {        long timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();        int random = Random.Next(10009999);        return $"{prefix}{timestamp}{random}";    }}
// 使用示例var generator = new TimestampIdGenerator();string id = generator.GenerateId("ORDER-");Console.WriteLine(id); // 輸出類似:ORDER-16970496000001234

  • 優點:簡單易實現。
  • 缺點:可能重復。無序。

3. 基于 UUID/GUID 的 ID 生成器
生成全局唯一的 UUID/GUID。
using System;
public class GuidIdGenerator{    public string GenerateId()    {        return Guid.NewGuid().ToString();    }}
// 使用示例var generator = new GuidIdGenerator();string id = generator.GenerateId();Console.WriteLine(id); // 輸出類似:550e8400-e29b-41d4-a716-446655440000

  • 優點:全局唯一。無需中心化生成。
  • 缺點:較長(36 個字符)。無序。

4. 基于 Redis 的自增 ID 生成器
使用 Redis 的 INCR 命令生成全局唯一的自增 ID。
using StackExchange.Redis;
public class RedisIdGenerator{    private readonly IDatabase _redisDb;
    public RedisIdGenerator(string connectionString)    {        var redis = ConnectionMultiplexer.Connect(connectionString);        _redisDb = redis.GetDatabase();    }
    public long GenerateId(string key = "global:id")    {        return _redisDb.StringIncrement(key);    }}
// 使用示例var generator = new RedisIdGenerator("localhost");long id = generator.GenerateId();Console.WriteLine(id); // 輸出自增的 ID

  • 優點:高性能。適合分布式系統。
  • 缺點:依賴 Redis。

5. 自定義 ID 生成器
可以根據業務需求自定義 ID 生成規則。例如:

  • 前綴 + 時間戳 + 隨機數。
  • 業務編碼 + 自增序列。

using System;
public class CustomIdGenerator{    private static readonly Random Random = new Random();
    public string GenerateId(string prefix)    {        long timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();        int random = Random.Next(10009999);        return $"{prefix}-{timestamp}-{random}";    }}
// 使用示例var generator = new CustomIdGenerator();string id = generator.GenerateId("USER");Console.WriteLine(id); // 輸出類似:USER-1697049600000-1234

  • 優點:靈活,符合業務需求。
  • 缺點:需要自行實現。


6. MongoDB ObjectId
MongoDB 使用 ObjectId 作為默認的唯一標識符,它是一個 12 字節的十六進制字符串。
using MongoDB.Bson;
ObjectId id = ObjectId.GenerateNewId();Console.WriteLine(id); // 輸出類似:507f1f77bcf86cd799439011

  • 優點:全局唯一。包含時間戳信息。
  • 缺點:較長(24 個字符)。

該文章在 2025/2/12 10:48:23 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 97国产婷婷综合视 | 欧美伦理一区 | 亚洲论片在线观看 | 精品女同一区二区三区免费站 | 精品亚洲影视自拍 | 精品国产福利在线观看91啪 | 三级日韩| 在线第一页 | 日韩欧美视频一二区 | 香蕉影院在线观看 | 日韩精品一区二区国产精品一 | 日韩精品中文乱码在线观看 | 日韩欧美一区二区三区免费看 | 国产肥熟女视频一区二 | 97视频全国精品 | 中文字幕精品乱码亚洲一区 | 日本高清中文字幕在线 | 日本中文字幕精 | 欧美激情视频在线免费观看 | 国产精品一区韩国电影日本 | 日本中文字幕在线观看 | 国产在线精品一区二区在线看 | 国产手机视频在线 | 91干逼网 | 日韩亚洲欧美精品性爱 | 国产伦精品一区二区三区免.费 | 欧洲精品| 综合色就爱涩涩涩综合婷婷 | 精品一区二区三区中文字幕 | 国产高清成免费视频 | 国产大片a免费在线手机观看 | 片免费观看 | 国产日韩欧美在线精品综合网 | 经典日韩中文字幕综合网 | 自在拍在线播放 | 亚洲国产日韩在线播放 | 亚洲欧美日韩中文字幕二区 | 国产亚洲欧美日韩在线看片 | 亚洲欧美日韩精品综合网 | 免费观看最新电影和热门影视剧 | 日韩欧美激情刺激 |