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]( />* [分布式唯一标识符](

