| @@ -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; | ||||
| } | } | ||||
| } | |||||
| } | |||||