From 8baa83777f8f43176b1834700ef335cad6131b9e Mon Sep 17 00:00:00 2001 From: zhouzj Date: Sun, 14 Mar 2021 02:03:37 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84StartTime?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- C#/README.md | 54 +------------------ C#/source/Yitter.IdGenTest/Program.cs | 2 +- .../Contract/IdGeneratorOptions.cs | 2 +- .../Yitter.IdGenerator/Core/SnowWorkerM1.cs | 8 +-- .../Yitter.IdGenerator/DefaultIdGenerator.cs | 4 +- .../Yitter.IdGenerator.csproj | 2 +- Java/README.md | 54 ++----------------- .../yitter/contract/IdGeneratorOptions.java | 2 +- .../java/com/yitter/core/SnowWorkerM1.java | 6 +-- .../com/yitter/idgen/DefaultIdGenerator.java | 31 ++++------- .../main/java/com/yitter/test/GenTest.java | 4 ++ .../main/java/com/yitter/test/StartUp.java | 2 +- README.md | 7 +-- 13 files changed, 38 insertions(+), 140 deletions(-) diff --git a/C#/README.md b/C#/README.md index ab5d09d..b28b625 100644 --- a/C#/README.md +++ b/C#/README.md @@ -20,57 +20,7 @@ var newId = IdHelper.NextId(); ``` 如果基于DI框架集成,可以参考 IdHelper 去管理 IdGenerator 对象,必须使用**单例**模式。 -## options说明 -``` -public class IdGeneratorOptions -{ - /// - /// 雪花计算方法 - /// (1|2) - /// - public short Method { get; set; } = 1; - - /// - /// 开始时间(UTC格式) - /// 不能超过当前系统时间 - /// - public DateTime StartTime { get; set; } = DateTime.MinValue; - - /// - /// 机器码 - /// 与 WorkerIdBitLength 有关系 - /// - public ushort WorkerId { get; set; } = 0; - - /// - /// 机器码位长 - /// 范围:2-21(要求:序列数位长+机器码位长不超过22)。 - /// 建议范围:6-12。 - /// - public byte WorkerIdBitLength { get; set; } = 6; - - /// - /// 序列数位长 - /// 范围:2-21(要求:序列数位长+机器码位长不超过22)。 - /// 建议范围:6-14。 - /// - public byte SeqBitLength { get; set; } = 6; - - /// - /// 最大序列数(含) - /// (由SeqBitLength计算的最大值) - /// - public int MaxSeqNumber { get; set; } = 0; +## options 默认值及说明 - /// - /// 最小序列数(含) - /// 默认11,不小于5,不大于MaxSeqNumber-2 - /// - public ushort MinSeqNumber { get; set; } = 11; +参考源码:/Contract/IdGeneratorOptions.cs - /// - /// 最大漂移次数(含), - /// 默认2000,推荐范围500-10000(与计算能力有关) - /// - public int TopOverCostCount { get; set; } = 2000; -``` \ No newline at end of file diff --git a/C#/source/Yitter.IdGenTest/Program.cs b/C#/source/Yitter.IdGenTest/Program.cs index cbfbe17..b54c111 100644 --- a/C#/source/Yitter.IdGenTest/Program.cs +++ b/C#/source/Yitter.IdGenTest/Program.cs @@ -50,7 +50,7 @@ namespace Yitter.OrgSystem.TestA //MinSeqNumber = 11, //MaxSeqNumber = 200, - StartTime = DateTime.Now.AddYears(-10), + BaseTime = DateTime.Now.AddYears(-10), }; // ++++++++++++++++++++++++++++++++ diff --git a/C#/source/Yitter.IdGenerator/Contract/IdGeneratorOptions.cs b/C#/source/Yitter.IdGenerator/Contract/IdGeneratorOptions.cs index 51bae2f..73105b2 100644 --- a/C#/source/Yitter.IdGenerator/Contract/IdGeneratorOptions.cs +++ b/C#/source/Yitter.IdGenerator/Contract/IdGeneratorOptions.cs @@ -25,7 +25,7 @@ namespace Yitter.IdGenerator /// 开始时间(UTC格式) /// 不能超过当前系统时间 /// - public virtual DateTime StartTime { get; set; } = DateTime.MinValue; + public virtual DateTime BaseTime { get; set; } = new DateTime(2020, 2, 20, 2, 20, 2, 20, DateTimeKind.Utc); /// /// 机器码 diff --git a/C#/source/Yitter.IdGenerator/Core/SnowWorkerM1.cs b/C#/source/Yitter.IdGenerator/Core/SnowWorkerM1.cs index 4510484..3275047 100644 --- a/C#/source/Yitter.IdGenerator/Core/SnowWorkerM1.cs +++ b/C#/source/Yitter.IdGenerator/Core/SnowWorkerM1.cs @@ -21,7 +21,7 @@ namespace Yitter.IdGenerator /// /// 基础时间 /// - protected readonly DateTime StartTimeUtc = new DateTime(2020, 2, 20, 2, 20, 2, 20, DateTimeKind.Utc); + protected readonly DateTime BaseTime; /// /// 机器码 @@ -78,9 +78,9 @@ namespace Yitter.IdGenerator MinSeqNumber = options.MinSeqNumber; TopOverCostCount = options.TopOverCostCount; - if (options.StartTime != DateTime.MinValue) + if (options.BaseTime != DateTime.MinValue) { - StartTimeUtc = options.StartTime; + BaseTime = options.BaseTime; } if (WorkerId < 1) @@ -278,7 +278,7 @@ namespace Yitter.IdGenerator protected virtual long GetCurrentTimeTick() { - return (long)(DateTime.UtcNow - StartTimeUtc).TotalMilliseconds; + return (long)(DateTime.UtcNow - BaseTime).TotalMilliseconds; } protected virtual long GetNextTimeTick() diff --git a/C#/source/Yitter.IdGenerator/DefaultIdGenerator.cs b/C#/source/Yitter.IdGenerator/DefaultIdGenerator.cs index deb6ed7..3e2b2fc 100644 --- a/C#/source/Yitter.IdGenerator/DefaultIdGenerator.cs +++ b/C#/source/Yitter.IdGenerator/DefaultIdGenerator.cs @@ -35,9 +35,9 @@ namespace Yitter.IdGenerator throw new ApplicationException("options error."); } - if (options.StartTime > DateTime.Now) + if (options.BaseTime < DateTime.Now.AddYears(-50) || options.BaseTime > DateTime.Now) { - throw new ApplicationException("StartTime error."); + throw new ApplicationException("BaseTime error."); } if (options.SeqBitLength + options.WorkerIdBitLength > 22) diff --git a/C#/source/Yitter.IdGenerator/Yitter.IdGenerator.csproj b/C#/source/Yitter.IdGenerator/Yitter.IdGenerator.csproj index 4e1364f..141e4f4 100644 --- a/C#/source/Yitter.IdGenerator/Yitter.IdGenerator.csproj +++ b/C#/source/Yitter.IdGenerator/Yitter.IdGenerator.csproj @@ -18,7 +18,7 @@ Yitter https://gitee.com/yitter/idgenerator MIT - 1.0.3 + 1.0.6 diff --git a/Java/README.md b/Java/README.md index d6cad96..3f56fd2 100644 --- a/Java/README.md +++ b/Java/README.md @@ -1,7 +1,7 @@ ## л -JDK 1.8 +JDK 1.8+ ## maven ``` @@ -21,56 +21,8 @@ long newId = IdHelper.nextId(); ``` DIܼɣԲο IdHelper ȥ IdGenerator 󣬱ʹ****ģʽ -## options˵ -``` -/** - * ѩ㷽 - * 1-Ư㷨|2-ͳ㷨Ĭ1 - */ - public short Method = 1; - - /** - * ʼʱ - * ܳǰϵͳʱ - */ - public long StartTime = 0; - - /** - * 룬ⲿϵͳ - * WorkerIdBitLength йϵ - */ - public short WorkerId = 0; - - /** - * λ - * Χ2-21Ҫλ+λ22 - * 鷶Χ6-12 - */ - public byte WorkerIdBitLength = 6; - - /** - * λ - * Χ2-21Ҫλ+λ22 - * 鷶Χ6-14 - */ - public byte SeqBitLength = 6; - - /** - * - * SeqBitLengthֵ - */ - public short MaxSeqNumber = 0; - /** - * С - * Ĭ11С5MaxSeqNumber-2 - */ - public short MinSeqNumber = 11; +## options Ĭֵ˵ - /** - * Ưƴ - * Ĭ2000ƼΧ500-10000йأ - */ - public short TopOverCostCount = 2000; +οԴ룺/contract/IdGeneratorOptions.java -``` \ No newline at end of file diff --git a/Java/source/src/main/java/com/yitter/contract/IdGeneratorOptions.java b/Java/source/src/main/java/com/yitter/contract/IdGeneratorOptions.java index 543a466..7984b7a 100644 --- a/Java/source/src/main/java/com/yitter/contract/IdGeneratorOptions.java +++ b/Java/source/src/main/java/com/yitter/contract/IdGeneratorOptions.java @@ -20,7 +20,7 @@ public class IdGeneratorOptions { * 开始时间 * 不能超过当前系统时间 */ - public long StartTime = 0; + public long BaseTime = 1582136402000L; /** * 机器码,必须由外部系统设置 diff --git a/Java/source/src/main/java/com/yitter/core/SnowWorkerM1.java b/Java/source/src/main/java/com/yitter/core/SnowWorkerM1.java index 5d14c69..f67e665 100644 --- a/Java/source/src/main/java/com/yitter/core/SnowWorkerM1.java +++ b/Java/source/src/main/java/com/yitter/core/SnowWorkerM1.java @@ -14,7 +14,7 @@ public class SnowWorkerM1 implements ISnowWorker { /** * 基础时间 */ - protected final long StartTimeUtc; + protected final long BaseTime; /** * 机器码 @@ -67,7 +67,7 @@ public class SnowWorkerM1 implements ISnowWorker { MaxSeqNumber = options.MaxSeqNumber > 0 ? options.MaxSeqNumber : (int) Math.pow(2, SeqBitLength); MinSeqNumber = options.MinSeqNumber; TopOverCostCount = options.TopOverCostCount; - StartTimeUtc = options.StartTime != 0 ? options.StartTime : 1582136402000L; + BaseTime = options.BaseTime != 0 ? options.BaseTime : 1582136402000L; _TimestampShift = (byte) (WorkerIdBitLength + SeqBitLength); _CurrentSeqNumber = options.MinSeqNumber; } @@ -224,7 +224,7 @@ public class SnowWorkerM1 implements ISnowWorker { protected long GetCurrentTimeTick() { long millis = System.currentTimeMillis(); - return millis - StartTimeUtc; + return millis - BaseTime; } protected long GetNextTimeTick() { diff --git a/Java/source/src/main/java/com/yitter/idgen/DefaultIdGenerator.java b/Java/source/src/main/java/com/yitter/idgen/DefaultIdGenerator.java index fc638f5..ac916fc 100644 --- a/Java/source/src/main/java/com/yitter/idgen/DefaultIdGenerator.java +++ b/Java/source/src/main/java/com/yitter/idgen/DefaultIdGenerator.java @@ -17,46 +17,38 @@ public class DefaultIdGenerator implements IIdGenerator { private final ISnowWorker _SnowWorker; public DefaultIdGenerator(IdGeneratorOptions options) throws IdGeneratorException { - if (options == null) - { + if (options == null) { throw new IdGeneratorException("options error."); } - if (options.StartTime > System.currentTimeMillis()) - { - throw new IdGeneratorException("StartTime error."); + if (options.BaseTime < 315504000000L || options.BaseTime > System.currentTimeMillis()) { + throw new IdGeneratorException("BaseTime error."); } - if (options.SeqBitLength + options.WorkerIdBitLength > 22) - { + if (options.SeqBitLength + options.WorkerIdBitLength > 22) { throw new IdGeneratorException("error:WorkerIdBitLength + SeqBitLength <= 22"); } double maxWorkerIdNumber = Math.pow(2, options.WorkerIdBitLength) - 1; - if (options.WorkerId < 1 || options.WorkerId > maxWorkerIdNumber) - { + if (options.WorkerId < 1 || options.WorkerId > maxWorkerIdNumber) { throw new IdGeneratorException("WorkerId error. (range:[1, " + maxWorkerIdNumber + "]"); } - if (options.SeqBitLength < 2 || options.SeqBitLength > 21) - { + if (options.SeqBitLength < 2 || options.SeqBitLength > 21) { throw new IdGeneratorException("SeqBitLength error. (range:[2, 21])"); } double maxSeqNumber = Math.pow(2, options.SeqBitLength) - 1; - if (options.MaxSeqNumber < 0 || options.MaxSeqNumber > maxSeqNumber) - { + if (options.MaxSeqNumber < 0 || options.MaxSeqNumber > maxSeqNumber) { throw new IdGeneratorException("MaxSeqNumber error. (range:[1, " + maxSeqNumber + "]"); } double maxValue = maxSeqNumber - 2; - if (options.MinSeqNumber < 5 || options.MinSeqNumber > maxValue) - { + if (options.MinSeqNumber < 5 || options.MinSeqNumber > maxValue) { throw new IdGeneratorException("MinSeqNumber error. (range:[5, " + maxValue + "]"); } - switch (options.Method) - { + switch (options.Method) { case 1: _SnowWorker = new SnowWorkerM1(options); break; @@ -68,8 +60,7 @@ public class DefaultIdGenerator implements IIdGenerator { break; } - if (options.Method == 1) - { + if (options.Method == 1) { try { Thread.sleep(500); } catch (InterruptedException e) { @@ -79,7 +70,7 @@ public class DefaultIdGenerator implements IIdGenerator { } @Override - public long newLong() { + public long newLong() { return _SnowWorker.nextId(); } } diff --git a/Java/source/src/main/java/com/yitter/test/GenTest.java b/Java/source/src/main/java/com/yitter/test/GenTest.java index e7f24fb..06f6d8d 100644 --- a/Java/source/src/main/java/com/yitter/test/GenTest.java +++ b/Java/source/src/main/java/com/yitter/test/GenTest.java @@ -1,12 +1,15 @@ package com.yitter.test; import com.yitter.contract.IIdGenerator; +import java.util.HashSet; +import java.util.Set; public class GenTest { private IIdGenerator IdGen; private int GenIdCount; private int WorkerId; + private Set IdSet = new HashSet(); public GenTest(IIdGenerator idGen, int genIdCount, int workerId) { GenIdCount = genIdCount; @@ -19,6 +22,7 @@ public class GenTest { for (int i = 0; i < GenIdCount; i++) { long id = IdGen.newLong(); + // IdSet.add(id); } long end = System.currentTimeMillis(); diff --git a/Java/source/src/main/java/com/yitter/test/StartUp.java b/Java/source/src/main/java/com/yitter/test/StartUp.java index ad82e9a..82c4a1a 100644 --- a/Java/source/src/main/java/com/yitter/test/StartUp.java +++ b/Java/source/src/main/java/com/yitter/test/StartUp.java @@ -31,7 +31,7 @@ public class StartUp { // options.MaxSeqNumber = 200; options.Method = method; - options.StartTime = 1582206693000L; // (2020-2-20) + options.BaseTime = 1582206693000L; options.WorkerId = 1; IIdGenerator IdGen = new DefaultIdGenerator(options); diff --git a/README.md b/README.md index bd3c919..055307f 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,9 @@ # IdGenerator ## 介绍 -用一种全新的雪花漂移算法,让ID更短、生成速度更快。 -核心在于缩短ID长度的同时,还能拥有极高瞬时并发处理量(50W/0.1s),及强大的配置能力。 +用一种全新的雪花漂移算法,让ID更短、生成速度更快。 +核心在于缩短ID长度的同时,还能拥有极高瞬时并发处理量(50W/0.1s)。 +顶尖优化,超强效能(位数更短,速度更快),全新 SnowFlake 算法,支持 C#/Java/Go/PHP 等语言。 ## 需求来源 @@ -138,7 +139,7 @@ 配置变更指是系统运行一段时间后,再变更运行参数(IdGeneratorOptions选项值),请注意: -1.最重要的一条原则是:StartTime **只能往前**(比老值更小、距离现在更远)赋值,原因是往后赋值极大可能产生相同的时间戳。[**不推荐**在系统运行之后调整 StartTime] +1.最重要的一条原则是:BaseTime **只能往前**(比老值更小、距离现在更远)赋值,原因是往后赋值极大可能产生相同的时间戳。[**不推荐**在系统运行之后调整 BaseTime] 2.任何时候增加 WorkerIdBitLength 或 SeqBitLength,都是可以的,但是慎用 “减小”的操作,因为这可能导致在未来某天生成的 ID 与过去老配置时相同。[允许在系统运行之后**增加**任何一个 BitLength 值]