using System.Runtime.InteropServices; using JNPF.Common.Cache; using JNPF.Common.Const; using JNPF.FriendlyException; using Yitter.IdGenerator; namespace JNPF.Common.Security; /// /// 分布式雪花ID帮助类. /// public class SnowflakeIdHelper { // 定义dll路径 public const string RegWorkerId_DLL_NAME = "lib\\regworkerid_lib_v1.3.1\\yitidgengo.dll"; // 根据文档定义三个接口 // 注册一个 WorkerId,会先注销所有本机已注册的记录 // ip: redis 服务器地址 // port: redis 端口 // password: redis 访问密码,可为空字符串“” // maxWorkerId: 最大 WorkerId [DllImport(RegWorkerId_DLL_NAME, EntryPoint = "RegisterOne", CallingConvention = CallingConvention.Cdecl, ExactSpelling = false)] private static extern ushort RegisterOne(string ip, int port, string password, int maxWorkerId); // 注销本机已注册的 WorkerId [DllImport(RegWorkerId_DLL_NAME, EntryPoint = "UnRegister", CallingConvention = CallingConvention.Cdecl, ExactSpelling = false)] private static extern void UnRegister(); // 检查本地WorkerId是否有效(0-有效,其它-无效) [DllImport(RegWorkerId_DLL_NAME, EntryPoint = "Validate", CallingConvention = CallingConvention.Cdecl, ExactSpelling = false)] private static extern int Validate(int workerId); /// /// 初始化YitId配置 /// public static void InitYitIdWorker() { //var option = new IdGeneratorOptions //{ // WorkerId = 1, //必须 全局唯一,必须 程序设定,理论最大值 2^WorkerIdBitLength-1 // //BaseTime = new DateTime(2023, 1, 1, 0, 0, 0, DateTimeKind.Utc), //用生成ID时的系统时间与基础时间的差值(毫秒数)作为生成ID的时间戳 // WorkerIdBitLength = 16, //机器码位长,决定 WorkerId 的最大值,默认值6,取值范围 [1, 16] // //SeqBitLength = 4, //序列数位长,默认值6,取值范围 [3, 21](建议不小于4),决定每毫秒基础生成的ID个数 // //MinSeqNumber = 5, //最小序列数,默认值5,取值范围 [5, MaxSeqNumber] // //MaxSeqNumber 最大序列数,设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0 //}; var option = App.GetConfig("YitId"); if (option.WorkerId == 0) { CacheOptions _cacheOptions = App.GetConfig("Cache", true); option.WorkerId = RegisterOne(_cacheOptions.ip, _cacheOptions.port, _cacheOptions.password, 63); } YitIdHelper.SetIdGenerator(option); } /// /// 生成ID. /// /// public static string NextId() { return YitIdHelper.NextId().ToString(); } }