日韩欧美人妻无码精品白浆,www.大香蕉久久网,狠狠的日狠狠的操,日本好好热在线观看

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

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

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

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

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


2. 基于時間戳和隨機數(shù)的 ID 生成器
結(jié)合時間戳和隨機數(shù)生成 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

  • 優(yōu)點:簡單易實現(xiàn)。
  • 缺點:可能重復(fù)。無序。

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)點:全局唯一。無需中心化生成。
  • 缺點:較長(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

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

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

  • 前綴 + 時間戳 + 隨機數(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)點:靈活,符合業(yè)務(wù)需求。
  • 缺點:需要自行實現(xiàn)。


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

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

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

日本一曲二曲三曲在线观看| 欧美刺激精品| 日韩一区二区图片| 嫩妣免费视频| 欧美日BT天天弄弄| 午夜侵犯久久电影| 日本污污网站在线观看| 夜夜夜夜夜撸撸撸| 欧美日本久久久无码| 欧美黄片网络| 99久久精品青青草电影| 美女被靠的嗷嗷叫视频| 欧美操肏视频直播| 熟妇激情毛片| 草三八五區| 麻豆AV野鸡网在线播放| 99re在线亚洲| 夜夜春夜夜操夜夜春夜夜操夜夜春| 久久久无码日韩欧美一区| 经典三级一区二区三区视频| 日韩二三区波| 久久久久久国产精品黄色片| 美女与男人日b中文视频| 日韩夫妻狠插p啪啪av| 日韩一本道一级视频| 一级大黄高潮在线| 五月丁香在线视频网站| 精品wwwwwww| 欧美熟妇乱久久| 色播五月开心久久| caoporn超碰在线12进入| 激情文学88t中文字幕在线| 黄片免费看视频| 国产欧美日在线| 国产视频三区六区| 久久久久久久久久噜噜噜噜噜噜 | 中日精品-色哟呦| 日本久久精品论免| 五月丁香欧美久久| 国产麻豆视频三级片在线观看| 精品自拍电影一区|