diff --git a/C#.NET/source/Yitter.IdGenTest/Program.cs b/C#.NET/source/Yitter.IdGenTest/Program.cs
index 74228a2..8dfc158 100644
--- a/C#.NET/source/Yitter.IdGenTest/Program.cs
+++ b/C#.NET/source/Yitter.IdGenTest/Program.cs
@@ -12,7 +12,7 @@ namespace Yitter.OrgSystem.TestA
class Program
{
// 测试参数(默认配置下,最佳性能是10W/s)
- static int genIdCount = 500000;//5000; // 计算ID数量(如果要验证50W效率,请将TopOverCostCount设置为2000或适当增加SeqBitLength)
+ static int genIdCount = 50000;//5000; // 计算ID数量(如果要验证50W效率,请将TopOverCostCount设置为2000或适当增加SeqBitLength)
static short method = 1; // 1-漂移算法,2-传统算法
@@ -39,7 +39,7 @@ namespace Yitter.OrgSystem.TestA
WorkerIdBitLength = 6,
SeqBitLength = 6,
- DataCenterIdBitLength = 10,
+ DataCenterIdBitLength = 0,
TopOverCostCount = 2000,
//TimestampType = 1,
@@ -142,8 +142,8 @@ namespace Yitter.OrgSystem.TestA
//WorkerIdBitLength = 6,
SeqBitLength = 6,
- //DataCenterIdBitLength = 0,
//TopOverCostCount = 2000,
+ //DataCenterIdBitLength = 0,
//TimestampType = 1,
// MinSeqNumber = 1,
diff --git a/C#.NET/source/Yitter.IdGenerator/Contract/IdGeneratorOptions.cs b/C#.NET/source/Yitter.IdGenerator/Contract/IdGeneratorOptions.cs
index 1ff5c42..613e9af 100644
--- a/C#.NET/source/Yitter.IdGenerator/Contract/IdGeneratorOptions.cs
+++ b/C#.NET/source/Yitter.IdGenerator/Contract/IdGeneratorOptions.cs
@@ -63,7 +63,6 @@ namespace Yitter.IdGenerator
///
public virtual int TopOverCostCount { get; set; } = 2000;
-
///
/// 数据中心ID(默认0)
///
diff --git a/C#.NET/source/Yitter.IdGenerator/Core/SnowWorkerM1.cs b/C#.NET/source/Yitter.IdGenerator/Core/SnowWorkerM1.cs
index 5671349..709a489 100644
--- a/C#.NET/source/Yitter.IdGenerator/Core/SnowWorkerM1.cs
+++ b/C#.NET/source/Yitter.IdGenerator/Core/SnowWorkerM1.cs
@@ -118,10 +118,10 @@ namespace Yitter.IdGenerator
// 7.Others
TopOverCostCount = options.TopOverCostCount;
- if (TopOverCostCount == 0)
- {
- TopOverCostCount = 2000;
- }
+ //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 4bb4d13..f21ad03 100644
--- a/C#.NET/source/Yitter.IdGenerator/DefaultIdGenerator.cs
+++ b/C#.NET/source/Yitter.IdGenerator/DefaultIdGenerator.cs
@@ -92,6 +92,12 @@ namespace Yitter.IdGenerator
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:
diff --git a/C/source/idgen/IdGenerator.c b/C/source/idgen/IdGenerator.c
index 00f94d4..d1938ca 100644
--- a/C/source/idgen/IdGenerator.c
+++ b/C/source/idgen/IdGenerator.c
@@ -9,107 +9,147 @@
#include
#include "IdGenerator.h"
-
-static inline uint64_t WorkerM1Id() {
+static inline uint64_t WorkerM1Id()
+{
return WorkerM1NextId(_idGenerator->Worker);
}
-static inline uint64_t WorkerM2Id() {
+static inline uint64_t WorkerM2Id()
+{
return WorkerM2NextId(_idGenerator->Worker);
}
-
-extern IdGenerator *GetIdGenInstance() {
+extern IdGenerator *GetIdGenInstance()
+{
if (_idGenerator != NULL)
return _idGenerator;
- else {
- _idGenerator = (IdGenerator *) malloc(sizeof(IdGenerator));
+ else
+ {
+ _idGenerator = (IdGenerator *)malloc(sizeof(IdGenerator));
_idGenerator->Worker = NewSnowFlakeWorker();
return _idGenerator;
}
}
-extern void SetOptions(IdGeneratorOptions options) {
- if (GetIdGenInstance() == NULL) {
+extern void SetOptions(IdGeneratorOptions options)
+{
+ if (GetIdGenInstance() == NULL)
+ {
exit(1);
}
// 1.BaseTime
- if (options.BaseTime == 0) {
+ if (options.BaseTime == 0)
+ {
_idGenerator->Worker->BaseTime = 1582136402000;
- } else if (options.BaseTime < 631123200000 || options.BaseTime > GetCurrentTime()) {
+ }
+ else if (options.BaseTime < 631123200000 || options.BaseTime > GetCurrentTime())
+ {
perror("BaseTime error.");
exit(1);
- } else {
+ }
+ else
+ {
_idGenerator->Worker->BaseTime = options.BaseTime;
}
// 2.WorkerIdBitLength
- if (options.WorkerIdBitLength <= 0) {
+ if (options.WorkerIdBitLength <= 0)
+ {
perror("WorkerIdBitLength error.(range:[1, 21])");
exit(1);
}
- if (options.SeqBitLength + options.WorkerIdBitLength > 22) {
+ if (options.SeqBitLength + options.WorkerIdBitLength > 22)
+ {
perror("error:WorkerIdBitLength + SeqBitLength <= 22");
exit(1);
- } else {
+ }
+ else
+ {
// _idGenerator->Worker->WorkerIdBitLength = options.WorkerIdBitLength;
_idGenerator->Worker->WorkerIdBitLength = options.WorkerIdBitLength <= 0 ? 6 : options.WorkerIdBitLength;
}
// 3.WorkerId
uint32_t maxWorkerIdNumber = (1 << options.WorkerIdBitLength) - 1;
- if (maxWorkerIdNumber == 0) {
+ if (maxWorkerIdNumber == 0)
+ {
maxWorkerIdNumber = 63;
}
- if (options.WorkerId < 0 || options.WorkerId > maxWorkerIdNumber) {
+ if (options.WorkerId < 0 || options.WorkerId > maxWorkerIdNumber)
+ {
perror("WorkerId error. (range:[0, {2^options.WorkerIdBitLength-1]}");
exit(1);
- } else {
+ }
+ else
+ {
_idGenerator->Worker->WorkerId = options.WorkerId;
}
// 4.SeqBitLength
- if (options.SeqBitLength < 2 || options.SeqBitLength > 21) {
+ if (options.SeqBitLength < 2 || options.SeqBitLength > 21)
+ {
perror("SeqBitLength error. (range:[2, 21])");
exit(1);
- } else {
+ }
+ else
+ {
// _idGenerator->Worker->SeqBitLength = options.SeqBitLength;
_idGenerator->Worker->SeqBitLength = options.SeqBitLength <= 0 ? 6 : options.SeqBitLength;
}
// 5.MaxSeqNumber
uint32_t maxSeqNumber = (1 << options.SeqBitLength) - 1;
- if (maxSeqNumber == 0) {
+ if (maxSeqNumber == 0)
+ {
maxSeqNumber = 63;
}
- if (options.MaxSeqNumber > maxSeqNumber) {
+ if (options.MaxSeqNumber > maxSeqNumber)
+ {
perror("MaxSeqNumber error. (range:[1, {2^options.SeqBitLength-1}]");
exit(1);
- } else {
+ }
+ else
+ {
_idGenerator->Worker->MaxSeqNumber = options.MaxSeqNumber <= 0 ? maxSeqNumber : options.MaxSeqNumber;
}
// 6.MinSeqNumber
- if (options.MinSeqNumber < 5 || options.MinSeqNumber > maxSeqNumber) {
+ if (options.MinSeqNumber < 5 || options.MinSeqNumber > maxSeqNumber)
+ {
perror("MinSeqNumber error. (range:[5, {options.MinSeqNumber}]");
exit(1);
- } else {
+ }
+ else
+ {
_idGenerator->Worker->MinSeqNumber = options.MinSeqNumber <= 0 ? 5 : options.MinSeqNumber;
}
- // 7.Others
- _idGenerator->Worker->TopOverCostCount = options.TopOverCostCount <= 0 ? 2000 : options.TopOverCostCount;
+ // 7.TopOverCostCount
+ if (options.TopOverCostCount < 0 || options.TopOverCostCount > 10000)
+ {
+ perror("TopOverCostCount error. (range:[0, 10000]");
+ exit(1);
+ }
+ else
+ {
+ //_idGenerator->Worker->TopOverCostCount = options.TopOverCostCount <= 0 ? 2000 : options.TopOverCostCount;
+ _idGenerator->Worker->TopOverCostCount = options.TopOverCostCount;
+ }
+
+ // 8.Others
_idGenerator->Worker->_TimestampShift =
- _idGenerator->Worker->WorkerIdBitLength + _idGenerator->Worker->SeqBitLength;
+ _idGenerator->Worker->WorkerIdBitLength + _idGenerator->Worker->SeqBitLength;
_idGenerator->Worker->_CurrentSeqNumber = _idGenerator->Worker->MinSeqNumber;
_idGenerator->Worker->Method = options.Method;
- if (options.Method == 2) {
+ if (options.Method == 2)
+ {
_idGenerator->NextId = WorkerM2Id;
- } else {
+ }
+ else
+ {
_idGenerator->NextId = WorkerM1Id;
- usleep(500*1000); // 暂停500ms
+ usleep(500 * 1000); // 暂停500ms
}
}
-
diff --git a/Go/source/idgen/DefaultIdGenerator.go b/Go/source/idgen/DefaultIdGenerator.go
index cb05185..6c3ca60 100644
--- a/Go/source/idgen/DefaultIdGenerator.go
+++ b/Go/source/idgen/DefaultIdGenerator.go
@@ -4,6 +4,7 @@
* 代码修订:yitter
* 开源地址:https://github.com/yitter/idgenerator
*/
+
package idgen
import (
@@ -64,6 +65,11 @@ func NewDefaultIdGenerator(options *IdGeneratorOptions) *DefaultIdGenerator {
panic("MinSeqNumber error. (range:[5, " + strconv.FormatUint(uint64(maxSeqNumber), 10) + "]")
}
+ // 7.TopOverCostCount
+ if options.TopOverCostCount < 0 || options.TopOverCostCount > 10000 {
+ panic("TopOverCostCount error. (range:[0, 10000]")
+ }
+
var snowWorker ISnowWorker
switch options.Method {
case 1:
diff --git a/Go/source/idgen/SnowWorkerM1.go b/Go/source/idgen/SnowWorkerM1.go
index e5b5e94..02e017c 100644
--- a/Go/source/idgen/SnowWorkerM1.go
+++ b/Go/source/idgen/SnowWorkerM1.go
@@ -4,6 +4,7 @@
* 代码修订:yitter
* 开源地址:https://github.com/yitter/idgenerator
*/
+
package idgen
import (
@@ -13,13 +14,13 @@ import (
// SnowWorkerM1 .
type SnowWorkerM1 struct {
- BaseTime int64 //基础时间
- WorkerId uint16 //机器码
- WorkerIdBitLength byte //机器码位长
- SeqBitLength byte //自增序列数位长
- MaxSeqNumber uint32 //最大序列数(含)
- MinSeqNumber uint32 //最小序列数(含)
- TopOverCostCount uint32 //最大漂移次数
+ BaseTime int64 // 基础时间
+ WorkerId uint16 // 机器码
+ WorkerIdBitLength byte // 机器码位长
+ SeqBitLength byte // 自增序列数位长
+ MaxSeqNumber uint32 // 最大序列数(含)
+ MinSeqNumber uint32 // 最小序列数(含)
+ TopOverCostCount uint32 // 最大漂移次数
_TimestampShift byte
_CurrentSeqNumber uint32
@@ -75,12 +76,13 @@ func NewSnowWorkerM1(options *IdGeneratorOptions) ISnowWorker {
// 6.MinSeqNumber
var minSeqNumber = options.MinSeqNumber
- // 7.Others
+ // 7.TopOverCostCount
var topOverCostCount = options.TopOverCostCount
- if topOverCostCount == 0 {
- topOverCostCount = 2000
- }
+ // if topOverCostCount == 0 {
+ // topOverCostCount = 2000
+ // }
+ // 8.Others
timestampShift := (byte)(workerIdBitLength + seqBitLength)
currentSeqNumber := minSeqNumber
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 aeb423d..cfee4f9 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
@@ -66,7 +66,8 @@ public class SnowWorkerM1 implements ISnowWorker {
SeqBitLength = options.SeqBitLength == 0 ? 6 : options.SeqBitLength;
MaxSeqNumber = options.MaxSeqNumber <= 0 ? (1 << SeqBitLength) - 1 : options.MaxSeqNumber;
MinSeqNumber = options.MinSeqNumber;
- TopOverCostCount = options.TopOverCostCount == 0 ? 2000 : options.TopOverCostCount;
+ // TopOverCostCount = options.TopOverCostCount == 0 ? 2000 : options.TopOverCostCount;
+ TopOverCostCount = options.TopOverCostCount;
_TimestampShift = (byte) (WorkerIdBitLength + SeqBitLength);
_CurrentSeqNumber = MinSeqNumber;
}
@@ -150,11 +151,11 @@ 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);
}
@@ -214,7 +215,7 @@ public class SnowWorkerM1 implements ISnowWorker {
long tempTimeTicker = GetCurrentTimeTick();
while (tempTimeTicker <= _LastTimeTick) {
- try {
+ try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
@@ -232,4 +233,3 @@ public class SnowWorkerM1 implements ISnowWorker {
}
}
}
-
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 0863d63..2353006 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
@@ -11,7 +11,6 @@ import com.github.yitter.contract.IdGeneratorOptions;
import com.github.yitter.core.SnowWorkerM1;
import com.github.yitter.core.SnowWorkerM2;
-
public class DefaultIdGenerator implements IIdGenerator {
private static ISnowWorker _SnowWorker = null;
@@ -40,7 +39,8 @@ public class DefaultIdGenerator implements IIdGenerator {
maxWorkerIdNumber = 63;
}
if (options.WorkerId < 0 || options.WorkerId > maxWorkerIdNumber) {
- throw new IdGeneratorException("WorkerId error. (range:[0, " + (maxWorkerIdNumber > 0 ? maxWorkerIdNumber : 63) + "]");
+ throw new IdGeneratorException(
+ "WorkerId error. (range:[0, " + (maxWorkerIdNumber > 0 ? maxWorkerIdNumber : 63) + "]");
}
// 4.SeqBitLength
@@ -62,6 +62,11 @@ public class DefaultIdGenerator implements IIdGenerator {
throw new IdGeneratorException("MinSeqNumber error. (range:[5, " + maxSeqNumber + "]");
}
+ // 7.TopOverCostCount
+ if (options.TopOverCostCount < 0 || options.TopOverCostCount > 10000) {
+ throw new IdGeneratorException("TopOverCostCount error. (range:[0, 10000]");
+ }
+
switch (options.Method) {
case 2:
_SnowWorker = new SnowWorkerM2(options);
diff --git a/Java/source/src/test/java/com/github/yitter/test/GenTest.java b/Java/source/src/test/java/com/github/yitter/test/GenTest.java
index 036ec86..4071b71 100644
--- a/Java/source/src/test/java/com/github/yitter/test/GenTest.java
+++ b/Java/source/src/test/java/com/github/yitter/test/GenTest.java
@@ -26,7 +26,7 @@ public class GenTest {
long end = System.currentTimeMillis();
long time = end - start;
- System.out.println(id);
+ // System.out.println(id);
System.out.println("++++++++++++++++++++++++++++++++++++++++WorkerId: "
+ WorkerId + ", total: " + time + " ms");
diff --git a/Java/source/src/test/java/com/github/yitter/test/StartUp.java b/Java/source/src/test/java/com/github/yitter/test/StartUp.java
index 7f57b59..dbe782c 100644
--- a/Java/source/src/test/java/com/github/yitter/test/StartUp.java
+++ b/Java/source/src/test/java/com/github/yitter/test/StartUp.java
@@ -25,7 +25,7 @@ public class StartUp {
// options.BaseTime = 1582206693000L;
options.Method = method;
options.WorkerId = 1;
- options.TopOverCostCount=2000;
+ // options.TopOverCostCount=2000;
// 首先测试一下 IdHelper 方法,获取单个Id
YitIdHelper.setIdGenerator(options);
@@ -39,7 +39,7 @@ public class StartUp {
while (true) {
genTest.GenStart();
Thread.sleep(1000); // 每隔1秒执行一次GenStart
- System.out.println("Hello World! Java");
+ // System.out.println("Hello World! Java");
}
} catch (InterruptedException e) {
e.printStackTrace();
diff --git a/Rust/source/src/idgen/snow_worker_m1.rs b/Rust/source/src/idgen/snow_worker_m1.rs
index 636c281..0af5720 100644
--- a/Rust/source/src/idgen/snow_worker_m1.rs
+++ b/Rust/source/src/idgen/snow_worker_m1.rs
@@ -2,10 +2,10 @@
* 版权属于:yitter(yitter@126.com)
* 开源地址:https://github.com/yitter/idgenerator
*/
-use std::{thread};
+use crate::idgen::*;
use chrono::Utc;
+use std::thread;
use std::thread::sleep;
-use crate::idgen::*;
// use lazy_static::lazy_static;
pub struct SnowWorkerM1 {
@@ -42,26 +42,30 @@ impl SnowWorkerM1 {
}
pub fn SetOptions(&mut self, options: IdGeneratorOptions) {
-
// 1.BaseTime
if options.BaseTime == 0 {
self.BaseTime = 1582136402000;
- } else if options.BaseTime < 631123200000 || options.BaseTime > Utc::now().timestamp_millis() {
+ } else if options.BaseTime < 631123200000
+ || options.BaseTime > Utc::now().timestamp_millis()
+ {
panic!("BaseTime error.");
} else {
self.BaseTime = options.BaseTime;
}
// 2.WorkerIdBitLength
- if options.WorkerIdBitLength <= 0
- {
+ if options.WorkerIdBitLength <= 0 {
panic!("WorkerIdBitLength error.(range:[1, 21])");
}
if options.SeqBitLength + options.WorkerIdBitLength > 22 {
panic!("error:WorkerIdBitLength + SeqBitLength <= 22");
} else {
// self.WorkerIdBitLength = options.WorkerIdBitLength;
- self.WorkerIdBitLength = if options.WorkerIdBitLength <= 0 { 6 } else { options.WorkerIdBitLength };
+ self.WorkerIdBitLength = if options.WorkerIdBitLength <= 0 {
+ 6
+ } else {
+ options.WorkerIdBitLength
+ };
}
// 3.WorkerId
@@ -80,7 +84,11 @@ impl SnowWorkerM1 {
panic!("SeqBitLength error. (range:[2, 21])");
} else {
// self.SeqBitLength = options.SeqBitLength;
- self.SeqBitLength = if options.SeqBitLength <= 0 { 6 } else { options.SeqBitLength };
+ self.SeqBitLength = if options.SeqBitLength <= 0 {
+ 6
+ } else {
+ options.SeqBitLength
+ };
}
// 5.MaxSeqNumber
@@ -91,7 +99,11 @@ impl SnowWorkerM1 {
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
+ };
}
// 6.MinSeqNumber
@@ -102,8 +114,15 @@ impl SnowWorkerM1 {
// self.MinSeqNumber = if options.MinSeqNumber <= 0 { 5 } else { options.MinSeqNumber };
}
- // 7.Others
- self.TopOverCostCount = if options.TopOverCostCount == 0 { 2000 } else { options.TopOverCostCount };
+ // 7.TopOverCostCount
+ //self.TopOverCostCount = if options.TopOverCostCount == 0 { 2000 } else { options.TopOverCostCount };
+ if options.TopOverCostCount < 0 || options.TopOverCostCount > 10000 {
+ panic!("TopOverCostCount error. (range:[0, 10000]");
+ } else {
+ self.TopOverCostCount = options.TopOverCostCount;
+ }
+
+ // 8.Others
self._TimestampShift = self.WorkerIdBitLength + self.SeqBitLength;
self._CurrentSeqNumber = self.MinSeqNumber;
@@ -139,7 +158,11 @@ impl SnowWorkerM1 {
pub fn NextId(&mut self) -> i64 {
// println!("SeqBitLength: {}", self.SeqBitLength);
- if self._IsOverCost { self.NextOverCostId() } else { self.NextNormalId() }
+ if self._IsOverCost {
+ self.NextOverCostId()
+ } else {
+ self.NextNormalId()
+ }
}
fn DoGenIdAction(&self, arg: OverCostActionArg) {}
@@ -247,17 +270,17 @@ impl SnowWorkerM1 {
}
fn CalcId(&mut self, useTimeTick: i64) -> i64 {
- let result = (useTimeTick << self._TimestampShift) +
- (self.WorkerId << self.SeqBitLength) as i64 +
- (self._CurrentSeqNumber) as i64;
+ let result = (useTimeTick << self._TimestampShift)
+ + (self.WorkerId << self.SeqBitLength) as i64
+ + (self._CurrentSeqNumber) as i64;
self._CurrentSeqNumber += 1;
return result;
}
fn CalcTurnBackId(&mut self, useTimeTick: i64) -> i64 {
- let result = (useTimeTick << self._TimestampShift) +
- (self.WorkerId << self.SeqBitLength) as i64 +
- (self._TurnBackIndex) as i64;
+ let result = (useTimeTick << self._TimestampShift)
+ + (self.WorkerId << self.SeqBitLength) as i64
+ + (self._TurnBackIndex) as i64;
self._TurnBackTimeTick -= 1;
return result;
}
@@ -277,4 +300,4 @@ impl SnowWorkerM1 {
return tempTimeTicker;
}
-}
\ No newline at end of file
+}