欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

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

admin
2024年11月15日 20:57 本文熱度 356
唯一ID是我們?cè)诰幋a的時(shí)候經(jīng)常需要解決的需求。以下是幾種常見的 ID 生成方式的實(shí)現(xiàn)示例:

1. 基于 Snowflake 算法的 ID 生成器
Snowflake 是 Twitter 開源的分布式 ID 生成算法,生成的是一個(gè) 64 位的整數(shù) 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); // 傳入機(jī)器 IDlong id = generator.GenerateId();Console.WriteLine(id); // 輸出一個(gè) 64 位整數(shù)

  • 優(yōu)點(diǎn):高性能,支持分布式。生成的 ID 有序。
  • 缺點(diǎn):需要配置機(jī)器 ID。


2. 基于時(shí)間戳和隨機(jī)數(shù)的 ID 生成器
結(jié)合時(shí)間戳和隨機(jī)數(shù)生成 ID,適合簡(jiǎn)單場(chǎng)景。
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

  • 優(yōu)點(diǎn):簡(jiǎn)單易實(shí)現(xiàn)。
  • 缺點(diǎn):可能重復(fù)。無(wú)序。

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

  • 優(yōu)點(diǎn):全局唯一。無(wú)需中心化生成。
  • 缺點(diǎn):較長(zhǎng)(36 個(gè)字符)。無(wú)序。

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

  • 優(yōu)點(diǎn):高性能。適合分布式系統(tǒng)。
  • 缺點(diǎn):依賴 Redis。

5. 自定義 ID 生成器
可以根據(jù)業(yè)務(wù)需求自定義 ID 生成規(guī)則。例如:

  • 前綴 + 時(shí)間戳 + 隨機(jī)數(shù)。
  • 業(yè)務(wù)編碼 + 自增序列。

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

  • 優(yōu)點(diǎn):靈活,符合業(yè)務(wù)需求。
  • 缺點(diǎn):需要自行實(shí)現(xiàn)。


6. MongoDB ObjectId
MongoDB 使用 ObjectId 作為默認(rèn)的唯一標(biāo)識(shí)符,它是一個(gè) 12 字節(jié)的十六進(jìn)制字符串。
using MongoDB.Bson;
ObjectId id = ObjectId.GenerateNewId();Console.WriteLine(id); // 輸出類似:507f1f77bcf86cd799439011

  • 優(yōu)點(diǎn):全局唯一。包含時(shí)間戳信息。
  • 缺點(diǎn):較長(zhǎng)(24 個(gè)字符)。

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