From 046880ca8f44465ab330d45a4a86ac334c63db00 Mon Sep 17 00:00:00 2001 From: yitter Date: Sat, 3 Apr 2021 13:02:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=8F=82=E6=95=B0=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Contract/IdGeneratorOptions.cs | 2 +- .../source/Yitter.IdGenerator/Core/SnowWorkerM1.cs | 64 ++++++++++++------- .../Yitter.IdGenerator/DefaultIdGenerator.cs | 21 +++++-- .../Yitter.IdGenerator/Yitter.IdGenerator.csproj | 2 +- C/source/idgen/IdGenerator.c | 30 +++++---- Go/source/idgen/DefaultIdGenerator.go | 32 +++++++--- Go/source/idgen/SnowWorkerM1.go | 71 +++++++++++++++------- Java/README.md | 20 +++--- Java/source/pom.xml | 2 +- .../java/com/github/yitter/core/SnowWorkerM1.java | 25 ++++---- .../github/yitter/idgen/DefaultIdGenerator.java | 19 ++++-- .../main/java/com/github/yitter/test/StartUp.java | 2 + Rust/source/src/yitgen/core/snow_worker_m1.rs | 41 ++++++++----- 13 files changed, 218 insertions(+), 113 deletions(-) diff --git a/C#.NET/source/Yitter.IdGenerator/Contract/IdGeneratorOptions.cs b/C#.NET/source/Yitter.IdGenerator/Contract/IdGeneratorOptions.cs index cf58fdf..8a54b3b 100644 --- a/C#.NET/source/Yitter.IdGenerator/Contract/IdGeneratorOptions.cs +++ b/C#.NET/source/Yitter.IdGenerator/Contract/IdGeneratorOptions.cs @@ -56,7 +56,7 @@ namespace Yitter.IdGenerator /// /// 最小序列数(含) - /// 默认5,不小于1,不大于MaxSeqNumber + /// 默认5,不小于5,不大于MaxSeqNumber /// public virtual ushort MinSeqNumber { get; set; } = 5; diff --git a/C#.NET/source/Yitter.IdGenerator/Core/SnowWorkerM1.cs b/C#.NET/source/Yitter.IdGenerator/Core/SnowWorkerM1.cs index e89f644..2c0ffcf 100644 --- a/C#.NET/source/Yitter.IdGenerator/Core/SnowWorkerM1.cs +++ b/C#.NET/source/Yitter.IdGenerator/Core/SnowWorkerM1.cs @@ -57,8 +57,8 @@ namespace Yitter.IdGenerator protected static object _SyncLock = new object(); protected ushort _CurrentSeqNumber; - protected long _LastTimeTick = -1L; - protected long _TurnBackTimeTick = -1L; + protected long _LastTimeTick = 0; // -1L + protected long _TurnBackTimeTick = 0; // -1L; protected byte _TurnBackIndex = 0; protected bool _IsOverCost = false; @@ -73,34 +73,56 @@ namespace Yitter.IdGenerator public SnowWorkerM1(IdGeneratorOptions options) - { - WorkerId = options.WorkerId; - WorkerIdBitLength = options.WorkerIdBitLength; - SeqBitLength = options.SeqBitLength; - MaxSeqNumber = options.MaxSeqNumber; - MinSeqNumber = options.MinSeqNumber; - TopOverCostCount = options.TopOverCostCount; - + { + // 1.BaseTime if (options.BaseTime != DateTime.MinValue) { BaseTime = options.BaseTime; - } - - if (SeqBitLength == 0) + } + + // 2.WorkerIdBitLength + if (options.WorkerIdBitLength == 0) + { + WorkerIdBitLength = 6; + } + else + { + WorkerIdBitLength = options.WorkerIdBitLength; + } + + // 3.WorkerId + WorkerId = options.WorkerId; + + // 4.SeqBitLength + if (options.SeqBitLength == 0) { SeqBitLength = 6; - } - - if (WorkerIdBitLength == 0) + } + else { - WorkerIdBitLength = 6; - } - + SeqBitLength = options.SeqBitLength; + } + + // 5.MaxSeqNumber if (MaxSeqNumber == 0) { MaxSeqNumber = (1 << SeqBitLength) - 1; - } - + } + else + { + MaxSeqNumber = options.MaxSeqNumber; + } + + // 6.MinSeqNumber + MinSeqNumber = options.MinSeqNumber; + + // 7.Others + TopOverCostCount = options.TopOverCostCount; + if (TopOverCostCount == 0) + { + TopOverCostCount = 2000; + } + _TimestampShift = (byte)(WorkerIdBitLength + SeqBitLength); _CurrentSeqNumber = options.MinSeqNumber; diff --git a/C#.NET/source/Yitter.IdGenerator/DefaultIdGenerator.cs b/C#.NET/source/Yitter.IdGenerator/DefaultIdGenerator.cs index a59cdb0..e15e414 100644 --- a/C#.NET/source/Yitter.IdGenerator/DefaultIdGenerator.cs +++ b/C#.NET/source/Yitter.IdGenerator/DefaultIdGenerator.cs @@ -35,11 +35,13 @@ namespace Yitter.IdGenerator 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 if (options.WorkerIdBitLength <= 0) { throw new ApplicationException("WorkerIdBitLength error.(range:[1, 21])"); @@ -49,27 +51,38 @@ namespace Yitter.IdGenerator throw new ApplicationException("error:WorkerIdBitLength + SeqBitLength <= 22"); } + // 3.WorkerId 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 > 0 ? maxWorkerIdNumber : 63) + "]"); + throw new ApplicationException("WorkerId error. (range:[0, " + maxWorkerIdNumber + "]"); } + // 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 + "]"); } - var maxValue = maxSeqNumber; - if (options.MinSeqNumber < 1 || options.MinSeqNumber > maxValue) + // 6.MinSeqNumber + if (options.MinSeqNumber < 5 || options.MinSeqNumber > maxSeqNumber) { - throw new ApplicationException("MinSeqNumber error. (range:[1, " + maxValue + "]"); + throw new ApplicationException("MinSeqNumber error. (range:[5, " + maxSeqNumber + "]"); } switch (options.Method) diff --git a/C#.NET/source/Yitter.IdGenerator/Yitter.IdGenerator.csproj b/C#.NET/source/Yitter.IdGenerator/Yitter.IdGenerator.csproj index e95ea06..1994ba4 100644 --- a/C#.NET/source/Yitter.IdGenerator/Yitter.IdGenerator.csproj +++ b/C#.NET/source/Yitter.IdGenerator/Yitter.IdGenerator.csproj @@ -18,7 +18,7 @@ Yitter https://github.com/yitter/idgenerator MIT - 1.0.10 + 1.0.11 diff --git a/C/source/idgen/IdGenerator.c b/C/source/idgen/IdGenerator.c index 74b76c6..5a6b3cc 100644 --- a/C/source/idgen/IdGenerator.c +++ b/C/source/idgen/IdGenerator.c @@ -34,7 +34,7 @@ extern void SetOptions(IdGeneratorOptions options) { exit(1); } - // BaseTime + // 1.BaseTime if (options.BaseTime == 0) { _idGenerator->Worker->BaseTime = 1582136402000; } else if (options.BaseTime < 631123200000 || options.BaseTime > GetCurrentTime()) { @@ -44,7 +44,7 @@ extern void SetOptions(IdGeneratorOptions options) { _idGenerator->Worker->BaseTime = options.BaseTime; } - // WorkerIdBitLength + // 2.WorkerIdBitLength if (options.WorkerIdBitLength <= 0) { perror("WorkerIdBitLength error.(range:[1, 21])"); exit(1); @@ -53,12 +53,15 @@ extern void SetOptions(IdGeneratorOptions options) { perror("error:WorkerIdBitLength + SeqBitLength <= 22"); exit(1); } else { -// _idGenerator->Worker->WorkerIdBitLength = options.WorkerIdBitLength; + // _idGenerator->Worker->WorkerIdBitLength = options.WorkerIdBitLength; _idGenerator->Worker->WorkerIdBitLength = options.WorkerIdBitLength <= 0 ? 6 : options.WorkerIdBitLength; } - // WorkerId + // 3.WorkerId uint32_t maxWorkerIdNumber = (1 << options.WorkerIdBitLength) - 1; + if (maxWorkerIdNumber == 0) { + maxWorkerIdNumber = 63; + } if (options.WorkerId < 0 || options.WorkerId > maxWorkerIdNumber) { perror("WorkerId error. (range:[0, {2^options.WorkerIdBitLength-1]}"); exit(1); @@ -66,17 +69,20 @@ extern void SetOptions(IdGeneratorOptions options) { _idGenerator->Worker->WorkerId = options.WorkerId; } - // SeqBitLength + // 4.SeqBitLength if (options.SeqBitLength < 2 || options.SeqBitLength > 21) { perror("SeqBitLength error. (range:[2, 21])"); exit(1); } else { -// _idGenerator->Worker->SeqBitLength = options.SeqBitLength; + // _idGenerator->Worker->SeqBitLength = options.SeqBitLength; _idGenerator->Worker->SeqBitLength = options.SeqBitLength <= 0 ? 6 : options.SeqBitLength; } - // MaxSeqNumber + // 5.MaxSeqNumber uint32_t maxSeqNumber = (1 << options.SeqBitLength) - 1; + if (maxSeqNumber == 0) { + maxSeqNumber = 63; + } if (options.MaxSeqNumber > maxSeqNumber) { perror("MaxSeqNumber error. (range:[1, {2^options.SeqBitLength-1}]"); exit(1); @@ -84,17 +90,19 @@ extern void SetOptions(IdGeneratorOptions options) { _idGenerator->Worker->MaxSeqNumber = options.MaxSeqNumber <= 0 ? maxSeqNumber : options.MaxSeqNumber; } - // MinSeqNumber - if (options.MinSeqNumber > maxSeqNumber || options.MinSeqNumber < 5) { + // 6.MinSeqNumber + if (options.MinSeqNumber < 5 || options.MinSeqNumber > maxSeqNumber) { perror("MinSeqNumber error. (range:[5, {options.MinSeqNumber}]"); exit(1); } else { _idGenerator->Worker->MinSeqNumber = options.MinSeqNumber <= 0 ? 5 : options.MinSeqNumber; } + // 7.Others _idGenerator->Worker->TopOverCostCount = options.TopOverCostCount <= 0 ? 2000 : options.TopOverCostCount; - _idGenerator->Worker->_TimestampShift = options.WorkerIdBitLength + options.SeqBitLength; - _idGenerator->Worker->_CurrentSeqNumber = options.MinSeqNumber; + _idGenerator->Worker->_TimestampShift = + _idGenerator->Worker->WorkerIdBitLength + _idGenerator->Worker->SeqBitLength; + _idGenerator->Worker->_CurrentSeqNumber = _idGenerator->Worker->MinSeqNumber; _idGenerator->Worker->Method = options.Method; if (options.Method == 2) { diff --git a/Go/source/idgen/DefaultIdGenerator.go b/Go/source/idgen/DefaultIdGenerator.go index a185edd..a07efa0 100644 --- a/Go/source/idgen/DefaultIdGenerator.go +++ b/Go/source/idgen/DefaultIdGenerator.go @@ -22,36 +22,49 @@ func NewDefaultIdGenerator(options *IdGeneratorOptions) *DefaultIdGenerator { panic("dig.Options error.") } + // 1.BaseTime minTime := int64(631123200000) // time.Now().AddDate(-30, 0, 0).UnixNano() / 1e6 if options.BaseTime < minTime || options.BaseTime > time.Now().UnixNano()/1e6 { panic("BaseTime error.") } - if options.SeqBitLength+options.WorkerIdBitLength > 22 { + // 2.WorkerIdBitLength + if options.WorkerIdBitLength <= 0 { + panic("WorkerIdBitLength error.(range:[1, 21])") + } + if options.WorkerIdBitLength+options.SeqBitLength > 22 { panic("error:WorkerIdBitLength + SeqBitLength <= 22") } - maxWorkerIDNumber := uint16(1< maxWorkerIDNumber { - panic("WorkerId error. (range:[1, " + strconv.FormatUint(uint64(maxWorkerIDNumber), 10) + "]") + // 3.WorkerId + maxWorkerIdNumber := uint16(1< maxWorkerIdNumber { + panic("WorkerId error. (range:[0, " + strconv.FormatUint(uint64(maxWorkerIdNumber), 10) + "]") } + // 4.SeqBitLength if options.SeqBitLength < 2 || options.SeqBitLength > 21 { panic("SeqBitLength error. (range:[2, 21])") } + // 5.MaxSeqNumber maxSeqNumber := uint32(1< maxSeqNumber { + if maxSeqNumber == 0 { + maxSeqNumber = 63 + } + if options.MaxSeqNumber < 0 || options.MaxSeqNumber > maxSeqNumber { panic("MaxSeqNumber error. (range:[1, " + strconv.FormatUint(uint64(maxSeqNumber), 10) + "]") } - if options.MinSeqNumber > maxSeqNumber { - panic("MinSeqNumber error. (range:[1, " + strconv.FormatUint(uint64(maxSeqNumber), 10) + "]") + // 6.MinSeqNumber + if options.MinSeqNumber < 5 || options.MinSeqNumber > maxSeqNumber { + panic("MinSeqNumber error. (range:[5, " + strconv.FormatUint(uint64(maxSeqNumber), 10) + "]") } - var snowWorker ISnowWorker - switch options.Method { case 1: snowWorker = NewSnowWorkerM1(options) @@ -64,6 +77,7 @@ func NewDefaultIdGenerator(options *IdGeneratorOptions) *DefaultIdGenerator { if options.Method == 1 { time.Sleep(time.Duration(500) * time.Microsecond) } + return &DefaultIdGenerator{ Options: options, SnowWorker: snowWorker, diff --git a/Go/source/idgen/SnowWorkerM1.go b/Go/source/idgen/SnowWorkerM1.go index c95e4f7..115798d 100644 --- a/Go/source/idgen/SnowWorkerM1.go +++ b/Go/source/idgen/SnowWorkerM1.go @@ -13,15 +13,16 @@ import ( // SnowWorkerM1 . type SnowWorkerM1 struct { - BaseTime int64 //基础时间 - WorkerId uint16 //机器码 - WorkerIdBitLength byte //机器码位长 - SeqBitLength byte //自增序列数位长 - MaxSeqNumber uint32 //最大序列数(含) - MinSeqNumber uint32 //最小序列数(含) - TopOverCostCount uint32 //最大漂移次数 - _TimestampShift byte - _CurrentSeqNumber uint32 + BaseTime int64 //基础时间 + WorkerId uint16 //机器码 + WorkerIdBitLength byte //机器码位长 + SeqBitLength byte //自增序列数位长 + MaxSeqNumber uint32 //最大序列数(含) + MinSeqNumber uint32 //最小序列数(含) + TopOverCostCount uint32 //最大漂移次数 + _TimestampShift byte + _CurrentSeqNumber uint32 + _LastTimeTick int64 _TurnBackTimeTick int64 _TurnBackIndex byte @@ -29,6 +30,7 @@ type SnowWorkerM1 struct { _OverCostCountInOneTerm uint32 _GenCountInOneTerm uint32 _TermIndex uint32 + sync.Mutex } @@ -38,46 +40,69 @@ func NewSnowWorkerM1(options *IdGeneratorOptions) ISnowWorker { var seqBitLength byte var maxSeqNumber uint32 - var workerId = options.WorkerId + // 1.BaseTime + var baseTime int64 + if options.BaseTime != 0 { + baseTime = options.BaseTime + } else { + baseTime = 1582136402000 + } + // 2.WorkerIdBitLength if options.WorkerIdBitLength == 0 { workerIdBitLength = 6 } else { workerIdBitLength = options.WorkerIdBitLength } + + // 3.WorkerId + var workerId = options.WorkerId + + // 4.SeqBitLength if options.SeqBitLength == 0 { seqBitLength = 6 } else { seqBitLength = options.SeqBitLength } - if options.MaxSeqNumber > 0 { - maxSeqNumber = options.MaxSeqNumber - } else { + + // 5.MaxSeqNumber + if options.MaxSeqNumber <= 0 { maxSeqNumber = (1 << seqBitLength) - 1 + } else { + maxSeqNumber = options.MaxSeqNumber } + + // 6.MinSeqNumber var minSeqNumber = options.MinSeqNumber - var topOverCostCount = options.TopOverCostCount - var baseTime int64 - if options.BaseTime != 0 { - baseTime = options.BaseTime - } else { - baseTime = 1582136402000 + // 7.Others + var topOverCostCount = options.TopOverCostCount + if topOverCostCount == 0 { + topOverCostCount = 2000 } - timestampShift := (byte)(options.WorkerIdBitLength + options.SeqBitLength) - currentSeqNumber := options.MinSeqNumber + timestampShift := (byte)(workerIdBitLength + seqBitLength) + currentSeqNumber := minSeqNumber return &SnowWorkerM1{ BaseTime: baseTime, - WorkerId: workerId, WorkerIdBitLength: workerIdBitLength, + WorkerId: workerId, SeqBitLength: seqBitLength, MaxSeqNumber: maxSeqNumber, MinSeqNumber: minSeqNumber, TopOverCostCount: topOverCostCount, _TimestampShift: timestampShift, - _CurrentSeqNumber: currentSeqNumber} + _CurrentSeqNumber: currentSeqNumber, + + _LastTimeTick: 0, + _TurnBackTimeTick: 0, + _TurnBackIndex: 0, + _IsOverCost: false, + _OverCostCountInOneTerm: 0, + _GenCountInOneTerm: 0, + _TermIndex: 0, + } } // DoGenIDAction . diff --git a/Java/README.md b/Java/README.md index 6075eff..cfdc9a1 100644 --- a/Java/README.md +++ b/Java/README.md @@ -1,34 +1,34 @@ -## л +## 运行环境 JDK 1.8+ -## maven +## 引用 maven 包 ``` com.github.yitter yitter-idgenerator - 1.0.3 + 1.0.5 ``` -## ʾ +## 调用示例 ``` -// ȫֳʼWorkerIdĬ2^16-1ͨ WorkerIdBitLength ֵ +// 全局初始化设置WorkerId,默认最大2^16-1,可通过调整 WorkerIdBitLength 增加最大值 IdGeneratorOptions options = new IdGeneratorOptions(); options.WorkerId = 1; YitIdHelper.setIdGenerator(options); -// ϳʼȫֻһΣұ +// 以上初始化过程全局只需一次,且必须最先设置 -// ʼԺ󣬼ҪIDĵط· +// 初始化以后,即可在需要生成ID的地方,调用以下方法。 long newId = YitIdHelper.nextId(); ``` -DIܼɣԲο YitIdHelper ȥ IdGenerator ʹ****ģʽ +如果基于DI框架集成,可以参考 YitIdHelper 去管理 IdGenerator 对象,须使用**单例**模式。 -## options Ĭֵ˵ +## options 默认值及说明 -οԴ룺/contract/IdGeneratorOptions.java +参考源码:/contract/IdGeneratorOptions.java diff --git a/Java/source/pom.xml b/Java/source/pom.xml index 6fb9e8e..a12a031 100644 --- a/Java/source/pom.xml +++ b/Java/source/pom.xml @@ -6,7 +6,7 @@ com.github.yitter yitter-idgenerator - 1.0.4-SNAPSHOT + 1.0.5 jar yitter-idgenerator diff --git a/Java/source/src/main/java/com/github/yitter/core/SnowWorkerM1.java b/Java/source/src/main/java/com/github/yitter/core/SnowWorkerM1.java index c67494d..46402a9 100644 --- a/Java/source/src/main/java/com/github/yitter/core/SnowWorkerM1.java +++ b/Java/source/src/main/java/com/github/yitter/core/SnowWorkerM1.java @@ -50,8 +50,8 @@ public class SnowWorkerM1 implements ISnowWorker { protected final static byte[] _SyncLock = new byte[0]; protected short _CurrentSeqNumber; - protected long _LastTimeTick = -1L; - protected long _TurnBackTimeTick = -1L; + protected long _LastTimeTick = 0; + protected long _TurnBackTimeTick = 0; protected byte _TurnBackIndex = 0; protected boolean _IsOverCost = false; @@ -60,15 +60,15 @@ public class SnowWorkerM1 implements ISnowWorker { protected int _TermIndex = 0; public SnowWorkerM1(IdGeneratorOptions options) { - WorkerId = options.WorkerId; + BaseTime = options.BaseTime != 0 ? options.BaseTime : 1582136402000L; WorkerIdBitLength = options.WorkerIdBitLength == 0 ? 6 : options.WorkerIdBitLength; + WorkerId = options.WorkerId; SeqBitLength = options.SeqBitLength == 0 ? 6 : options.SeqBitLength; - MaxSeqNumber = options.MaxSeqNumber > 0 ? options.MaxSeqNumber : (1 << SeqBitLength) - 1; + MaxSeqNumber = options.MaxSeqNumber <= 0 ? (1 << SeqBitLength) - 1 : options.MaxSeqNumber; MinSeqNumber = options.MinSeqNumber; - TopOverCostCount = options.TopOverCostCount; - BaseTime = options.BaseTime != 0 ? options.BaseTime : 1582136402000L; + TopOverCostCount = options.TopOverCostCount == 0 ? 2000 : options.TopOverCostCount; _TimestampShift = (byte) (WorkerIdBitLength + SeqBitLength); - _CurrentSeqNumber = options.MinSeqNumber; + _CurrentSeqNumber = MinSeqNumber; } private void DoGenIdAction(OverCostActionArg arg) { @@ -182,11 +182,12 @@ public class SnowWorkerM1 implements ISnowWorker { BeginTurnBackAction(_TurnBackTimeTick); } - try { - // Thread.sleep(1); - } catch (InterruptedException e) { - e.printStackTrace(); - } +// try { +// Thread.sleep(1); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } + return CalcTurnBackId(_TurnBackTimeTick); } diff --git a/Java/source/src/main/java/com/github/yitter/idgen/DefaultIdGenerator.java b/Java/source/src/main/java/com/github/yitter/idgen/DefaultIdGenerator.java index a293a02..2d46cd9 100644 --- a/Java/source/src/main/java/com/github/yitter/idgen/DefaultIdGenerator.java +++ b/Java/source/src/main/java/com/github/yitter/idgen/DefaultIdGenerator.java @@ -21,34 +21,45 @@ public class DefaultIdGenerator implements IIdGenerator { throw new IdGeneratorException("options error."); } + // 1.BaseTime if (options.BaseTime < 315504000000L || options.BaseTime > System.currentTimeMillis()) { throw new IdGeneratorException("BaseTime error."); } + // 2.WorkerIdBitLength if (options.WorkerIdBitLength <= 0) { throw new IdGeneratorException("WorkerIdBitLength error.(range:[1, 21])"); } - if (options.SeqBitLength + options.WorkerIdBitLength > 22) { + if (options.WorkerIdBitLength + options.SeqBitLength > 22) { throw new IdGeneratorException("error:WorkerIdBitLength + SeqBitLength <= 22"); } + // 3.WorkerId int maxWorkerIdNumber = (1 << options.WorkerIdBitLength) - 1; + if (maxWorkerIdNumber == 0) { + maxWorkerIdNumber = 63; + } if (options.WorkerId < 0 || options.WorkerId > maxWorkerIdNumber) { throw new IdGeneratorException("WorkerId error. (range:[0, " + (maxWorkerIdNumber > 0 ? maxWorkerIdNumber : 63) + "]"); } + // 4.SeqBitLength if (options.SeqBitLength < 2 || options.SeqBitLength > 21) { throw new IdGeneratorException("SeqBitLength error. (range:[2, 21])"); } + // 5.MaxSeqNumber int maxSeqNumber = (1 << options.SeqBitLength) - 1; + if (maxSeqNumber == 0) { + maxSeqNumber = 63; + } if (options.MaxSeqNumber < 0 || options.MaxSeqNumber > maxSeqNumber) { throw new IdGeneratorException("MaxSeqNumber error. (range:[1, " + maxSeqNumber + "]"); } - int maxValue = maxSeqNumber; - if (options.MinSeqNumber < 5 || options.MinSeqNumber > maxValue) { - throw new IdGeneratorException("MinSeqNumber error. (range:[5, " + maxValue + "]"); + // 6.MinSeqNumber + if (options.MinSeqNumber < 5 || options.MinSeqNumber > maxSeqNumber) { + throw new IdGeneratorException("MinSeqNumber error. (range:[5, " + maxSeqNumber + "]"); } switch (options.Method) { diff --git a/Java/source/src/main/java/com/github/yitter/test/StartUp.java b/Java/source/src/main/java/com/github/yitter/test/StartUp.java index 0bdf764..be161b0 100644 --- a/Java/source/src/main/java/com/github/yitter/test/StartUp.java +++ b/Java/source/src/main/java/com/github/yitter/test/StartUp.java @@ -53,3 +53,5 @@ public class StartUp { } } } + +// mvn clean deploy -P release \ No newline at end of file diff --git a/Rust/source/src/yitgen/core/snow_worker_m1.rs b/Rust/source/src/yitgen/core/snow_worker_m1.rs index fee604c..716c778 100644 --- a/Rust/source/src/yitgen/core/snow_worker_m1.rs +++ b/Rust/source/src/yitgen/core/snow_worker_m1.rs @@ -43,7 +43,7 @@ impl SnowWorkerM1 { pub fn SetOptions(&mut self, options: IdGeneratorOptions) { - // BaseTime + // 1.BaseTime if options.BaseTime == 0 { self.BaseTime = 1582136402000; } else if options.BaseTime < 631123200000 || options.BaseTime > Utc::now().timestamp_millis() { @@ -52,7 +52,7 @@ impl SnowWorkerM1 { self.BaseTime = options.BaseTime; } - // WorkerIdBitLength + // 2.WorkerIdBitLength if options.WorkerIdBitLength <= 0 { panic!("WorkerIdBitLength error.(range:[1, 21])"); @@ -64,15 +64,18 @@ impl SnowWorkerM1 { self.WorkerIdBitLength = if options.WorkerIdBitLength <= 0 { 6 } else { options.WorkerIdBitLength }; } - // WorkerId - let maxWorkerIdNumber = (1 << options.WorkerIdBitLength) - 1; + // 3.WorkerId + let mut maxWorkerIdNumber = (1 << options.WorkerIdBitLength) - 1; + if maxWorkerIdNumber == 0 { + maxWorkerIdNumber = 63; + } if options.WorkerId < 0 || options.WorkerId > maxWorkerIdNumber { - panic!("WorkerId error. (range:[0, {} ]", if maxWorkerIdNumber <= 0 { 63 } else { maxWorkerIdNumber }); + panic!("WorkerId error. (range:[0, {} ]", maxWorkerIdNumber); } else { self.WorkerId = options.WorkerId; } - // SeqBitLength + // 4.SeqBitLength if options.SeqBitLength < 2 || options.SeqBitLength > 21 { panic!("SeqBitLength error. (range:[2, 21])"); } else { @@ -80,24 +83,29 @@ impl SnowWorkerM1 { self.SeqBitLength = if options.SeqBitLength <= 0 { 6 } else { options.SeqBitLength }; } - // MaxSeqNumber - let maxSeqNumber = (1 << options.SeqBitLength) - 1; - if options.MaxSeqNumber > maxSeqNumber { + // 5.MaxSeqNumber + let mut maxSeqNumber = (1 << options.SeqBitLength) - 1; + if maxSeqNumber == 0 { + maxSeqNumber = 63; + } + if options.MaxSeqNumber < 0 || options.MaxSeqNumber > maxSeqNumber { panic!("MaxSeqNumber error. (range:[1, {}]", maxSeqNumber); } else { - self.MaxSeqNumber = if options.MaxSeqNumber <= 0 { maxSeqNumber } else { options.MaxSeqNumber }; + self.MaxSeqNumber = if options.MaxSeqNumber == 0 { maxSeqNumber } else { options.MaxSeqNumber }; } - // MinSeqNumber - if options.MinSeqNumber > maxSeqNumber || options.MinSeqNumber < 5 { + // 6.MinSeqNumber + if options.MinSeqNumber < 5 || options.MinSeqNumber > maxSeqNumber { panic!("MinSeqNumber error. (range:[5, {}]", maxSeqNumber); } else { - self.MinSeqNumber = if options.MinSeqNumber <= 0 { 5 } else { options.MinSeqNumber }; + self.MinSeqNumber = options.MinSeqNumber; + // self.MinSeqNumber = if options.MinSeqNumber <= 0 { 5 } else { options.MinSeqNumber }; } + // 7.Others self.TopOverCostCount = if options.TopOverCostCount == 0 { 2000 } else { options.TopOverCostCount }; - self._TimestampShift = options.WorkerIdBitLength + options.SeqBitLength; - self._CurrentSeqNumber = options.MinSeqNumber; + self._TimestampShift = self.WorkerIdBitLength + self.SeqBitLength; + self._CurrentSeqNumber = self.MinSeqNumber; if options.Method == 1 { sleep(std::time::Duration::from_millis(500)); @@ -107,14 +115,15 @@ impl SnowWorkerM1 { pub fn New(options: IdGeneratorOptions) -> SnowWorkerM1 { let mut worker = SnowWorkerM1 { BaseTime: 1582136402000, - WorkerId: 0, WorkerIdBitLength: 0, + WorkerId: 0, SeqBitLength: 0, MaxSeqNumber: 0, MinSeqNumber: 0, TopOverCostCount: 0, _TimestampShift: 0, _CurrentSeqNumber: 0, + _LastTimeTick: 0, _TurnBackTimeTick: 0, _TurnBackIndex: 0,