Browse Source

限定TopOverCostCount范围

pull/19/MERGE
yitter 2 years ago
parent
commit
b1b3d0cd6d
12 changed files with 164 additions and 83 deletions
  1. +3
    -3
      C#.NET/source/Yitter.IdGenTest/Program.cs
  2. +0
    -1
      C#.NET/source/Yitter.IdGenerator/Contract/IdGeneratorOptions.cs
  3. +4
    -4
      C#.NET/source/Yitter.IdGenerator/Core/SnowWorkerM1.cs
  4. +6
    -0
      C#.NET/source/Yitter.IdGenerator/DefaultIdGenerator.cs
  5. +72
    -32
      C/source/idgen/IdGenerator.c
  6. +6
    -0
      Go/source/idgen/DefaultIdGenerator.go
  7. +13
    -11
      Go/source/idgen/SnowWorkerM1.go
  8. +8
    -8
      Java/source/src/main/java/com/github/yitter/core/SnowWorkerM1.java
  9. +7
    -2
      Java/source/src/main/java/com/github/yitter/idgen/DefaultIdGenerator.java
  10. +1
    -1
      Java/source/src/test/java/com/github/yitter/test/GenTest.java
  11. +2
    -2
      Java/source/src/test/java/com/github/yitter/test/StartUp.java
  12. +42
    -19
      Rust/source/src/idgen/snow_worker_m1.rs

+ 3
- 3
C#.NET/source/Yitter.IdGenTest/Program.cs View File

@@ -12,7 +12,7 @@ namespace Yitter.OrgSystem.TestA
class Program class Program
{ {
// 测试参数(默认配置下,最佳性能是10W/s) // 测试参数(默认配置下,最佳性能是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-传统算法 static short method = 1; // 1-漂移算法,2-传统算法
@@ -39,7 +39,7 @@ namespace Yitter.OrgSystem.TestA
WorkerIdBitLength = 6, WorkerIdBitLength = 6,
SeqBitLength = 6, SeqBitLength = 6,
DataCenterIdBitLength = 10,
DataCenterIdBitLength = 0,
TopOverCostCount = 2000, TopOverCostCount = 2000,
//TimestampType = 1, //TimestampType = 1,
@@ -142,8 +142,8 @@ namespace Yitter.OrgSystem.TestA
//WorkerIdBitLength = 6, //WorkerIdBitLength = 6,
SeqBitLength = 6, SeqBitLength = 6,
//DataCenterIdBitLength = 0,
//TopOverCostCount = 2000, //TopOverCostCount = 2000,
//DataCenterIdBitLength = 0,
//TimestampType = 1, //TimestampType = 1,
// MinSeqNumber = 1, // MinSeqNumber = 1,


+ 0
- 1
C#.NET/source/Yitter.IdGenerator/Contract/IdGeneratorOptions.cs View File

@@ -63,7 +63,6 @@ namespace Yitter.IdGenerator
/// </summary> /// </summary>
public virtual int TopOverCostCount { get; set; } = 2000; public virtual int TopOverCostCount { get; set; } = 2000;
/// <summary> /// <summary>
/// 数据中心ID(默认0) /// 数据中心ID(默认0)
/// </summary> /// </summary>


+ 4
- 4
C#.NET/source/Yitter.IdGenerator/Core/SnowWorkerM1.cs View File

@@ -118,10 +118,10 @@ namespace Yitter.IdGenerator
// 7.Others // 7.Others
TopOverCostCount = options.TopOverCostCount; TopOverCostCount = options.TopOverCostCount;
if (TopOverCostCount == 0)
{
TopOverCostCount = 2000;
}
//if (TopOverCostCount == 0)
//{
// TopOverCostCount = 2000;
//}
_TimestampShift = (byte)(WorkerIdBitLength + SeqBitLength); _TimestampShift = (byte)(WorkerIdBitLength + SeqBitLength);
_CurrentSeqNumber = options.MinSeqNumber; _CurrentSeqNumber = options.MinSeqNumber;


+ 6
- 0
C#.NET/source/Yitter.IdGenerator/DefaultIdGenerator.cs View File

@@ -92,6 +92,12 @@ namespace Yitter.IdGenerator
throw new ApplicationException("MinSeqNumber error. (range:[5, " + 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) switch (options.Method)
{ {
case 2: case 2:


+ 72
- 32
C/source/idgen/IdGenerator.c View File

@@ -9,107 +9,147 @@
#include <unistd.h> #include <unistd.h>
#include "IdGenerator.h" #include "IdGenerator.h"
static inline uint64_t WorkerM1Id() {
static inline uint64_t WorkerM1Id()
{
return WorkerM1NextId(_idGenerator->Worker); return WorkerM1NextId(_idGenerator->Worker);
} }
static inline uint64_t WorkerM2Id() {
static inline uint64_t WorkerM2Id()
{
return WorkerM2NextId(_idGenerator->Worker); return WorkerM2NextId(_idGenerator->Worker);
} }
extern IdGenerator *GetIdGenInstance() {
extern IdGenerator *GetIdGenInstance()
{
if (_idGenerator != NULL) if (_idGenerator != NULL)
return _idGenerator; return _idGenerator;
else {
_idGenerator = (IdGenerator *) malloc(sizeof(IdGenerator));
else
{
_idGenerator = (IdGenerator *)malloc(sizeof(IdGenerator));
_idGenerator->Worker = NewSnowFlakeWorker(); _idGenerator->Worker = NewSnowFlakeWorker();
return _idGenerator; return _idGenerator;
} }
} }
extern void SetOptions(IdGeneratorOptions options) {
if (GetIdGenInstance() == NULL) {
extern void SetOptions(IdGeneratorOptions options)
{
if (GetIdGenInstance() == NULL)
{
exit(1); exit(1);
} }
// 1.BaseTime // 1.BaseTime
if (options.BaseTime == 0) {
if (options.BaseTime == 0)
{
_idGenerator->Worker->BaseTime = 1582136402000; _idGenerator->Worker->BaseTime = 1582136402000;
} else if (options.BaseTime < 631123200000 || options.BaseTime > GetCurrentTime()) {
}
else if (options.BaseTime < 631123200000 || options.BaseTime > GetCurrentTime())
{
perror("BaseTime error."); perror("BaseTime error.");
exit(1); exit(1);
} else {
}
else
{
_idGenerator->Worker->BaseTime = options.BaseTime; _idGenerator->Worker->BaseTime = options.BaseTime;
} }
// 2.WorkerIdBitLength // 2.WorkerIdBitLength
if (options.WorkerIdBitLength <= 0) {
if (options.WorkerIdBitLength <= 0)
{
perror("WorkerIdBitLength error.(range:[1, 21])"); perror("WorkerIdBitLength error.(range:[1, 21])");
exit(1); exit(1);
} }
if (options.SeqBitLength + options.WorkerIdBitLength > 22) {
if (options.SeqBitLength + options.WorkerIdBitLength > 22)
{
perror("error:WorkerIdBitLength + SeqBitLength <= 22"); perror("error:WorkerIdBitLength + SeqBitLength <= 22");
exit(1); exit(1);
} else {
}
else
{
// _idGenerator->Worker->WorkerIdBitLength = options.WorkerIdBitLength; // _idGenerator->Worker->WorkerIdBitLength = options.WorkerIdBitLength;
_idGenerator->Worker->WorkerIdBitLength = options.WorkerIdBitLength <= 0 ? 6 : options.WorkerIdBitLength; _idGenerator->Worker->WorkerIdBitLength = options.WorkerIdBitLength <= 0 ? 6 : options.WorkerIdBitLength;
} }
// 3.WorkerId // 3.WorkerId
uint32_t maxWorkerIdNumber = (1 << options.WorkerIdBitLength) - 1; uint32_t maxWorkerIdNumber = (1 << options.WorkerIdBitLength) - 1;
if (maxWorkerIdNumber == 0) {
if (maxWorkerIdNumber == 0)
{
maxWorkerIdNumber = 63; 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]}"); perror("WorkerId error. (range:[0, {2^options.WorkerIdBitLength-1]}");
exit(1); exit(1);
} else {
}
else
{
_idGenerator->Worker->WorkerId = options.WorkerId; _idGenerator->Worker->WorkerId = options.WorkerId;
} }
// 4.SeqBitLength // 4.SeqBitLength
if (options.SeqBitLength < 2 || options.SeqBitLength > 21) {
if (options.SeqBitLength < 2 || options.SeqBitLength > 21)
{
perror("SeqBitLength error. (range:[2, 21])"); perror("SeqBitLength error. (range:[2, 21])");
exit(1); exit(1);
} else {
}
else
{
// _idGenerator->Worker->SeqBitLength = options.SeqBitLength; // _idGenerator->Worker->SeqBitLength = options.SeqBitLength;
_idGenerator->Worker->SeqBitLength = options.SeqBitLength <= 0 ? 6 : options.SeqBitLength; _idGenerator->Worker->SeqBitLength = options.SeqBitLength <= 0 ? 6 : options.SeqBitLength;
} }
// 5.MaxSeqNumber // 5.MaxSeqNumber
uint32_t maxSeqNumber = (1 << options.SeqBitLength) - 1; uint32_t maxSeqNumber = (1 << options.SeqBitLength) - 1;
if (maxSeqNumber == 0) {
if (maxSeqNumber == 0)
{
maxSeqNumber = 63; maxSeqNumber = 63;
} }
if (options.MaxSeqNumber > maxSeqNumber) {
if (options.MaxSeqNumber > maxSeqNumber)
{
perror("MaxSeqNumber error. (range:[1, {2^options.SeqBitLength-1}]"); perror("MaxSeqNumber error. (range:[1, {2^options.SeqBitLength-1}]");
exit(1); exit(1);
} else {
}
else
{
_idGenerator->Worker->MaxSeqNumber = options.MaxSeqNumber <= 0 ? maxSeqNumber : options.MaxSeqNumber; _idGenerator->Worker->MaxSeqNumber = options.MaxSeqNumber <= 0 ? maxSeqNumber : options.MaxSeqNumber;
} }
// 6.MinSeqNumber // 6.MinSeqNumber
if (options.MinSeqNumber < 5 || options.MinSeqNumber > maxSeqNumber) {
if (options.MinSeqNumber < 5 || options.MinSeqNumber > maxSeqNumber)
{
perror("MinSeqNumber error. (range:[5, {options.MinSeqNumber}]"); perror("MinSeqNumber error. (range:[5, {options.MinSeqNumber}]");
exit(1); exit(1);
} else {
}
else
{
_idGenerator->Worker->MinSeqNumber = options.MinSeqNumber <= 0 ? 5 : options.MinSeqNumber; _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->_TimestampShift =
_idGenerator->Worker->WorkerIdBitLength + _idGenerator->Worker->SeqBitLength;
_idGenerator->Worker->WorkerIdBitLength + _idGenerator->Worker->SeqBitLength;
_idGenerator->Worker->_CurrentSeqNumber = _idGenerator->Worker->MinSeqNumber; _idGenerator->Worker->_CurrentSeqNumber = _idGenerator->Worker->MinSeqNumber;
_idGenerator->Worker->Method = options.Method; _idGenerator->Worker->Method = options.Method;
if (options.Method == 2) {
if (options.Method == 2)
{
_idGenerator->NextId = WorkerM2Id; _idGenerator->NextId = WorkerM2Id;
} else {
}
else
{
_idGenerator->NextId = WorkerM1Id; _idGenerator->NextId = WorkerM1Id;
usleep(500*1000); // 暂停500ms
usleep(500 * 1000); // 暂停500ms
} }
} }

+ 6
- 0
Go/source/idgen/DefaultIdGenerator.go View File

@@ -4,6 +4,7 @@
* 代码修订:yitter * 代码修订:yitter
* 开源地址:https://github.com/yitter/idgenerator * 开源地址:https://github.com/yitter/idgenerator
*/ */

package idgen package idgen


import ( import (
@@ -64,6 +65,11 @@ func NewDefaultIdGenerator(options *IdGeneratorOptions) *DefaultIdGenerator {
panic("MinSeqNumber error. (range:[5, " + strconv.FormatUint(uint64(maxSeqNumber), 10) + "]") 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 var snowWorker ISnowWorker
switch options.Method { switch options.Method {
case 1: case 1:


+ 13
- 11
Go/source/idgen/SnowWorkerM1.go View File

@@ -4,6 +4,7 @@
* 代码修订:yitter * 代码修订:yitter
* 开源地址:https://github.com/yitter/idgenerator * 开源地址:https://github.com/yitter/idgenerator
*/ */

package idgen package idgen


import ( import (
@@ -13,13 +14,13 @@ import (


// SnowWorkerM1 . // SnowWorkerM1 .
type SnowWorkerM1 struct { 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 _TimestampShift byte
_CurrentSeqNumber uint32 _CurrentSeqNumber uint32


@@ -75,12 +76,13 @@ func NewSnowWorkerM1(options *IdGeneratorOptions) ISnowWorker {
// 6.MinSeqNumber // 6.MinSeqNumber
var minSeqNumber = options.MinSeqNumber var minSeqNumber = options.MinSeqNumber


// 7.Others
// 7.TopOverCostCount
var topOverCostCount = options.TopOverCostCount var topOverCostCount = options.TopOverCostCount
if topOverCostCount == 0 {
topOverCostCount = 2000
}
// if topOverCostCount == 0 {
// topOverCostCount = 2000
// }


// 8.Others
timestampShift := (byte)(workerIdBitLength + seqBitLength) timestampShift := (byte)(workerIdBitLength + seqBitLength)
currentSeqNumber := minSeqNumber currentSeqNumber := minSeqNumber




+ 8
- 8
Java/source/src/main/java/com/github/yitter/core/SnowWorkerM1.java View File

@@ -66,7 +66,8 @@ public class SnowWorkerM1 implements ISnowWorker {
SeqBitLength = options.SeqBitLength == 0 ? 6 : options.SeqBitLength; SeqBitLength = options.SeqBitLength == 0 ? 6 : options.SeqBitLength;
MaxSeqNumber = options.MaxSeqNumber <= 0 ? (1 << SeqBitLength) - 1 : options.MaxSeqNumber; MaxSeqNumber = options.MaxSeqNumber <= 0 ? (1 << SeqBitLength) - 1 : options.MaxSeqNumber;
MinSeqNumber = options.MinSeqNumber; MinSeqNumber = options.MinSeqNumber;
TopOverCostCount = options.TopOverCostCount == 0 ? 2000 : options.TopOverCostCount;
// TopOverCostCount = options.TopOverCostCount == 0 ? 2000 : options.TopOverCostCount;
TopOverCostCount = options.TopOverCostCount;
_TimestampShift = (byte) (WorkerIdBitLength + SeqBitLength); _TimestampShift = (byte) (WorkerIdBitLength + SeqBitLength);
_CurrentSeqNumber = MinSeqNumber; _CurrentSeqNumber = MinSeqNumber;
} }
@@ -150,11 +151,11 @@ public class SnowWorkerM1 implements ISnowWorker {
BeginTurnBackAction(_TurnBackTimeTick); BeginTurnBackAction(_TurnBackTimeTick);
} }
// try {
// Thread.sleep(1);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// try {
// Thread.sleep(1);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
return CalcTurnBackId(_TurnBackTimeTick); return CalcTurnBackId(_TurnBackTimeTick);
} }
@@ -214,7 +215,7 @@ public class SnowWorkerM1 implements ISnowWorker {
long tempTimeTicker = GetCurrentTimeTick(); long tempTimeTicker = GetCurrentTimeTick();
while (tempTimeTicker <= _LastTimeTick) { while (tempTimeTicker <= _LastTimeTick) {
try {
try {
Thread.sleep(1); Thread.sleep(1);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
@@ -232,4 +233,3 @@ public class SnowWorkerM1 implements ISnowWorker {
} }
} }
} }

+ 7
- 2
Java/source/src/main/java/com/github/yitter/idgen/DefaultIdGenerator.java View File

@@ -11,7 +11,6 @@ import com.github.yitter.contract.IdGeneratorOptions;
import com.github.yitter.core.SnowWorkerM1; import com.github.yitter.core.SnowWorkerM1;
import com.github.yitter.core.SnowWorkerM2; import com.github.yitter.core.SnowWorkerM2;
public class DefaultIdGenerator implements IIdGenerator { public class DefaultIdGenerator implements IIdGenerator {
private static ISnowWorker _SnowWorker = null; private static ISnowWorker _SnowWorker = null;
@@ -40,7 +39,8 @@ public class DefaultIdGenerator implements IIdGenerator {
maxWorkerIdNumber = 63; maxWorkerIdNumber = 63;
} }
if (options.WorkerId < 0 || options.WorkerId > maxWorkerIdNumber) { 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 // 4.SeqBitLength
@@ -62,6 +62,11 @@ public class DefaultIdGenerator implements IIdGenerator {
throw new IdGeneratorException("MinSeqNumber error. (range:[5, " + maxSeqNumber + "]"); 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) { switch (options.Method) {
case 2: case 2:
_SnowWorker = new SnowWorkerM2(options); _SnowWorker = new SnowWorkerM2(options);


+ 1
- 1
Java/source/src/test/java/com/github/yitter/test/GenTest.java View File

@@ -26,7 +26,7 @@ public class GenTest {
long end = System.currentTimeMillis(); long end = System.currentTimeMillis();
long time = end - start; long time = end - start;
System.out.println(id);
// System.out.println(id);
System.out.println("++++++++++++++++++++++++++++++++++++++++WorkerId: " System.out.println("++++++++++++++++++++++++++++++++++++++++WorkerId: "
+ WorkerId + ", total: " + time + " ms"); + WorkerId + ", total: " + time + " ms");


+ 2
- 2
Java/source/src/test/java/com/github/yitter/test/StartUp.java View File

@@ -25,7 +25,7 @@ public class StartUp {
// options.BaseTime = 1582206693000L; // options.BaseTime = 1582206693000L;
options.Method = method; options.Method = method;
options.WorkerId = 1; options.WorkerId = 1;
options.TopOverCostCount=2000;
// options.TopOverCostCount=2000;
// 首先测试一下 IdHelper 方法,获取单个Id // 首先测试一下 IdHelper 方法,获取单个Id
YitIdHelper.setIdGenerator(options); YitIdHelper.setIdGenerator(options);
@@ -39,7 +39,7 @@ public class StartUp {
while (true) { while (true) {
genTest.GenStart(); genTest.GenStart();
Thread.sleep(1000); // 每隔1秒执行一次GenStart Thread.sleep(1000); // 每隔1秒执行一次GenStart
System.out.println("Hello World! Java");
// System.out.println("Hello World! Java");
} }
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();


+ 42
- 19
Rust/source/src/idgen/snow_worker_m1.rs View File

@@ -2,10 +2,10 @@
* 版权属于:yitter(yitter@126.com) * 版权属于:yitter(yitter@126.com)
* 开源地址:https://github.com/yitter/idgenerator * 开源地址:https://github.com/yitter/idgenerator
*/ */
use std::{thread};
use crate::idgen::*;
use chrono::Utc; use chrono::Utc;
use std::thread;
use std::thread::sleep; use std::thread::sleep;
use crate::idgen::*;
// use lazy_static::lazy_static; // use lazy_static::lazy_static;
pub struct SnowWorkerM1 { pub struct SnowWorkerM1 {
@@ -42,26 +42,30 @@ impl SnowWorkerM1 {
} }
pub fn SetOptions(&mut self, options: IdGeneratorOptions) { pub fn SetOptions(&mut self, options: IdGeneratorOptions) {
// 1.BaseTime // 1.BaseTime
if options.BaseTime == 0 { if options.BaseTime == 0 {
self.BaseTime = 1582136402000; 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."); panic!("BaseTime error.");
} else { } else {
self.BaseTime = options.BaseTime; self.BaseTime = options.BaseTime;
} }
// 2.WorkerIdBitLength // 2.WorkerIdBitLength
if options.WorkerIdBitLength <= 0
{
if options.WorkerIdBitLength <= 0 {
panic!("WorkerIdBitLength error.(range:[1, 21])"); panic!("WorkerIdBitLength error.(range:[1, 21])");
} }
if options.SeqBitLength + options.WorkerIdBitLength > 22 { if options.SeqBitLength + options.WorkerIdBitLength > 22 {
panic!("error:WorkerIdBitLength + SeqBitLength <= 22"); panic!("error:WorkerIdBitLength + SeqBitLength <= 22");
} else { } else {
// self.WorkerIdBitLength = options.WorkerIdBitLength; // 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 // 3.WorkerId
@@ -80,7 +84,11 @@ impl SnowWorkerM1 {
panic!("SeqBitLength error. (range:[2, 21])"); panic!("SeqBitLength error. (range:[2, 21])");
} else { } else {
// self.SeqBitLength = options.SeqBitLength; // 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 // 5.MaxSeqNumber
@@ -91,7 +99,11 @@ impl SnowWorkerM1 {
if options.MaxSeqNumber < 0 || options.MaxSeqNumber > maxSeqNumber { if options.MaxSeqNumber < 0 || options.MaxSeqNumber > maxSeqNumber {
panic!("MaxSeqNumber error. (range:[1, {}]", maxSeqNumber); panic!("MaxSeqNumber error. (range:[1, {}]", maxSeqNumber);
} else { } else {
self.MaxSeqNumber = if options.MaxSeqNumber == 0 { maxSeqNumber } else { options.MaxSeqNumber };
self.MaxSeqNumber = if options.MaxSeqNumber == 0 {
maxSeqNumber
} else {
options.MaxSeqNumber
};
} }
// 6.MinSeqNumber // 6.MinSeqNumber
@@ -102,8 +114,15 @@ impl SnowWorkerM1 {
// self.MinSeqNumber = if options.MinSeqNumber <= 0 { 5 } else { options.MinSeqNumber }; // 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._TimestampShift = self.WorkerIdBitLength + self.SeqBitLength;
self._CurrentSeqNumber = self.MinSeqNumber; self._CurrentSeqNumber = self.MinSeqNumber;
@@ -139,7 +158,11 @@ impl SnowWorkerM1 {
pub fn NextId(&mut self) -> i64 { pub fn NextId(&mut self) -> i64 {
// println!("SeqBitLength: {}", self.SeqBitLength); // 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) {} fn DoGenIdAction(&self, arg: OverCostActionArg) {}
@@ -247,17 +270,17 @@ impl SnowWorkerM1 {
} }
fn CalcId(&mut self, useTimeTick: i64) -> i64 { 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; self._CurrentSeqNumber += 1;
return result; return result;
} }
fn CalcTurnBackId(&mut self, useTimeTick: i64) -> i64 { 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; self._TurnBackTimeTick -= 1;
return result; return result;
} }
@@ -277,4 +300,4 @@ impl SnowWorkerM1 {
return tempTimeTicker; return tempTimeTicker;
} }
}
}

Loading…
Cancel
Save