LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C#生成唯一ID的几种方式

admin
2024年11月15日 20:57 本文热度 100
唯一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