@@ -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, | ||||
@@ -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> | ||||
@@ -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; | ||||
@@ -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: | ||||
@@ -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 | |||||
} | } | ||||
} | } | ||||
@@ -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: | ||||
@@ -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 | ||||
@@ -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 { | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -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); | ||||
@@ -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"); | ||||
@@ -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(); | ||||
@@ -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; | ||||
} | } | ||||
} | |||||
} |