当前位置:实例文章 » C#开发实例» [文章]C#雪花Id

C#雪花Id

发布人:shili8 发布时间:2024-11-14 11:15 阅读次数:0

**雪花ID(Snowflake ID)生成器**
=====================================**概述**
--------

雪花ID是一种分布式唯一标识符,用于解决传统的UUID(Universally Unique Identifier)在高并发环境下的性能问题。雪花ID由一个64位的整数组成,包括时间戳、机器ID和序列号。

**Snowflake ID 组成**
-------------------

* **时间戳(7 位):** 表示生成雪花ID的时间戳,以毫秒为单位。
* **机器ID(10 位):** 表示生成雪花ID的机器ID。
* **序列号(12 位):** 表示同一毫秒内生成的雪花ID顺序。

**Snowflake ID生成器**
----------------------

### SnowflakeIdGenerator 类

csharppublic class SnowflakeIdGenerator{
 private long _machineId;
 private long _sequence =0;

 public SnowflakeIdGenerator(long machineId)
 {
 _machineId = machineId;
 }

 public long GetNextId()
 {
 // 获取当前时间戳(以毫秒为单位)
 var timestamp = (long)DateTime.Now.Ticks /10000L;

 // 计算序列号 var sequence = Interlocked.Increment(ref _sequence);

 // 构造雪花ID return ((timestamp << 12) | (_machineId << 7) | sequence);
 }
}


### SnowflakeIdGeneratorExample 类
csharppublic class SnowflakeIdGeneratorExample{
 public static void Main()
 {
 var generator = new SnowflakeIdGenerator(GetMachineId());

 //生成10个雪花ID for (int i =0; i < 10; i++)
 {
 var id = generator.GetNextId();
 Console.WriteLine($"Snowflake ID: {id}");
 }
 }

 private static long GetMachineId()
 {
 // 获取本机的MAC地址 var macAddress = GetMacAddress();

 // 将MAC地址转换为数字 return BitConverter.ToInt64(macAddress,0);
 }

 private static byte[] GetMacAddress()
 {
 var nicName = NetworkInterface.NetworkInterface.GetPhysicalAddress().ToString();
 return Encoding.ASCII.GetBytes(nicName);
 }
}


**雪花ID示例**
----------------| Snowflake ID |
| --- |
|1234567890 |
|9876543210 |

**注意事项**
-------------

* **时间戳的精度:** snowflake ID 的时间戳以毫秒为单位,可能会导致同一毫秒内生成的雪花ID顺序不连续。
* **机器ID的唯一性:** snowflake ID依赖于机器ID的唯一性,如果多个机器共享相同的MAC地址,则可能会导致雪花ID冲突。

**参考**
--------

* [Snowflake ID]( />* [分布式唯一标识符](

相关标签:c#开发语言
其他信息

其他资源

Top