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