C# 中唯一ID的生成方法(C# 中高效生成唯一ID的实用方法)

原创
ithorizon 6个月前 (10-21) 阅读数 25 #后端开发

C# 中高效生成唯一ID的实用方法

一、引言

在软件开发中,生成唯一ID是一个常见的场景。唯一ID可以用于标识数据库中的记录、用户的会话、分布式系统中的请求等。C# 提供了多种生成唯一ID的方法,本文将介绍一些高效实用的生成唯一ID的方法。

二、GUID

GUID(全局唯一标识符)是一种广泛使用的唯一ID生成方法。在C#中,可以使用System.Guid类来生成GUID。

2.1 使用Guid.NewGuid()生成GUID

using System;

public class Program

{

public static void Main()

{

Guid guid = Guid.NewGuid();

Console.WriteLine("生成的GUID: " + guid.ToString());

}

}

Guid.NewGuid()方法会生成一个新的GUID,每次调用都会生成不同的GUID。这是一种单纯且高效的生成唯一ID的方法。

三、基于时间的唯一ID生成方法

除了GUID,还可以使用基于时间的唯一ID生成方法。这种方法生成的ID具有时间戳,可以反映出ID的生成顺序。

3.1 Snowflake算法

Snowflake算法是一种常用的基于时间的唯一ID生成算法。它由Twitter开源,可以生成64位的唯一ID。Snowflake算法将ID分为几部分:时间戳、数据中心ID、机器ID和序列号。

3.2 实现Snowflake算法

using System;

public class SnowflakeIdWorker

{

// 下面两个每个5位,加起来就是10位的机器标识

private long workerId;

private long datacenterId;

private long sequence = 0L;

// 用来记录生成ID的时间戳

private long lastTimestamp = -1L;

// 每一部分占用的位数

private const long workerIdBits = 5L;

private const long datacenterIdBits = 5L;

private const long sequenceBits = 12L;

// 每一部分的最大值

private const long maxWorkerId = -1L ^ (-1L << workerIdBits);

private const long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);

private const long sequenceMask = -1L ^ (-1L << sequenceBits);

// 每一部分向左的位移

private const long workerIdShift = sequenceBits;

private const long datacenterIdShift = sequenceBits + workerIdBits;

private const long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;

private const long twepoch = 1288834974657L;

public SnowflakeIdWorker(long workerId, long datacenterId)

{

if (workerId > maxWorkerId || workerId < 0)

{

throw new ArgumentException(String.Format("worker Id can't be greater than {0} or less than 0", maxWorkerId));

}

if (datacenterId > maxDatacenterId || datacenterId < 0)

{

throw new ArgumentException(String.Format("datacenter Id can't be greater than {0} or less than 0", maxDatacenterId));

}

this.workerId = workerId;

this.datacenterId = datacenterId;

}

public long NextId()

{

long timestamp = TimeGen();

if (timestamp < lastTimestamp)

{

throw new Exception(String.Format("Clock moved backwards. Refusing to generate id for {0} milliseconds", lastTimestamp - timestamp));

}

if (lastTimestamp == timestamp)

{

sequence = (sequence + 1) & sequenceMask;

if (sequence == 0)

{

timestamp = TilNextMillis(lastTimestamp);

}

}

else

{

sequence = 0L;

}

lastTimestamp = timestamp;

return ((timestamp - twepoch) << timestampLeftShift) |

(datacenterId << datacenterIdShift) |

(workerId << workerIdShift) |

sequence;

}

private long TilNextMillis(long lastTimestamp)

{

long timestamp = TimeGen();

while (timestamp <= lastTimestamp)

{

timestamp = TimeGen();

}

return timestamp;

}

private long TimeGen()

{

return DateTime.Now.Ticks - DateTime.Parse("1970-01-01 00:00:00").Ticks;

}

}

使用Snowflake算法生成的ID具有以下特点:

  • 全局唯一:通过数据中心ID和机器ID保证全局唯一。
  • 有序性:通过时间戳和序列号保证有序性。
  • 高可用性:不依存数据库等外部存储。

四、基于数据库的唯一ID生成方法

除了以上两种方法,还可以使用数据库来生成唯一ID。以下是一些常见的基于数据库的唯一ID生成方法。

4.1 数据库自增ID

大多数数据库都赞成自增ID。在创建表时,可以指定一个字段为自增字段,当插入新记录时,数据库会自动为该字段生成一个唯一ID。

4.2 UUID/GUID

某些数据库(如MySQL)赞成UUID函数,可以直接生成GUID作为唯一ID。

五、总结

本文介绍了C#中生成唯一ID的几种方法,包括GUID、基于时间的Snowflake算法和基于数据库的方法。每种方法都有其优缺点,可以基于实际需求选择合适的生成方法。

在实际应用中,选择哪种方法取决于系统的需求、性能和可扩展性。对于大多数场景,GUID和Snowflake算法都是不错的选择。如果系统需要高度的一致性和可靠性,可以考虑使用数据库来生成唯一ID。


本文由IT视界版权所有,禁止未经同意的情况下转发

文章标签: 后端开发


热门