/* * 版权属于:yitter(yitter@126.com) * 开源地址:https://github.com/yitter/idgenerator * 版权协议:MIT * 版权说明:只要保留本版权,你可以免费使用、修改、分发本代码。 * 免责条款:任何因为本代码产生的系统、法律、政治、宗教问题,均与版权所有者无关。 * */ using System; using System.Collections.Generic; using System.Text; using System.Threading; namespace Yitter.IdGenerator { /// /// 默认实现 /// public class DefaultIdGenerator : IIdGenerator { private ISnowWorker _SnowWorker { get; set; } public Action GenIdActionAsync { get => _SnowWorker.GenAction; set => _SnowWorker.GenAction = value; } public DefaultIdGenerator(IdGeneratorOptions options) { if (options == null) { throw new ApplicationException("options error."); } // 1.BaseTime if (options.BaseTime < DateTime.Now.AddYears(-50) || options.BaseTime > DateTime.Now) { throw new ApplicationException("BaseTime error."); } // 2.WorkerIdBitLength int maxLength = options.TimestampType == 0 ? 22 : 31; // (秒级时间戳时放大到31位) if (options.WorkerIdBitLength <= 0) { throw new ApplicationException("WorkerIdBitLength error.(range:[1, 21])"); } if (options.DataCenterIdBitLength + options.WorkerIdBitLength + options.SeqBitLength > maxLength) { throw new ApplicationException("error:DataCenterIdBitLength + WorkerIdBitLength + SeqBitLength <= " + maxLength); } // 3.WorkerId & DataCenterId var maxWorkerIdNumber = (1 << options.WorkerIdBitLength) - 1; if (maxWorkerIdNumber == 0) { maxWorkerIdNumber = 63; } if (options.WorkerId < 0 || options.WorkerId > maxWorkerIdNumber) { throw new ApplicationException("WorkerId error. (range:[0, " + maxWorkerIdNumber + "]"); } var maxDataCenterIdNumber = (1 << options.DataCenterIdBitLength) - 1; if (options.DataCenterId < 0 || options.DataCenterId > maxDataCenterIdNumber) { throw new ApplicationException("DataCenterId error. (range:[0, " + maxDataCenterIdNumber + "]"); } // 4.SeqBitLength if (options.SeqBitLength < 2 || options.SeqBitLength > 21) { throw new ApplicationException("SeqBitLength error. (range:[2, 21])"); } // 5.MaxSeqNumber var maxSeqNumber = (1 << options.SeqBitLength) - 1; if (maxSeqNumber == 0) { maxSeqNumber = 63; } if (options.MaxSeqNumber < 0 || options.MaxSeqNumber > maxSeqNumber) { throw new ApplicationException("MaxSeqNumber error. (range:[1, " + maxSeqNumber + "]"); } // 6.MinSeqNumber if (options.MinSeqNumber < 5 || options.MinSeqNumber > maxSeqNumber) { throw new ApplicationException("MinSeqNumber error. (range:[5, " + maxSeqNumber + "]"); } // 7.TopOverCostCount if (options.TopOverCostCount < 0 || options.TopOverCostCount > 10000) { throw new ApplicationException("TopOverCostCount error. (range:[0, 10000]"); } switch (options.Method) { case 2: _SnowWorker = new SnowWorkerM2(options); break; default: if (options.DataCenterIdBitLength == 0 && options.TimestampType == 0) { _SnowWorker = new SnowWorkerM1(options); } else { _SnowWorker = new SnowWorkerM3(options); } break; } if (options.Method != 2) { Thread.Sleep(500); } } public long NewLong() { return _SnowWorker.NextId(); } } }