|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302 |
- /*
- * 版权属于:yitter(yitter@126.com)
- * 开源地址:https://github.com/yitter/idgenerator
- */
- use crate::idgen::*;
- use chrono::Utc;
- use std::thread;
- use std::thread::sleep;
- // use lazy_static::lazy_static;
-
- pub struct SnowWorkerM1 {
- ///基础时间
- pub BaseTime: i64,
- ///机器码
- pub WorkerId: u32,
- ///机器码位长
- pub WorkerIdBitLength: u8,
- ///自增序列数位长
- pub SeqBitLength: u8,
- ///最大序列数(含)
- pub MaxSeqNumber: u32,
- ///最小序列数(含)
- pub MinSeqNumber: u32,
- ///最大漂移次数
- pub TopOverCostCount: u32,
-
- _TimestampShift: u8,
- _CurrentSeqNumber: u32,
- _LastTimeTick: i64,
- _TurnBackTimeTick: i64,
- _TurnBackIndex: u8,
- _IsOverCost: bool,
- _OverCostCountInOneTerm: u32,
- _GenCountInOneTerm: u32,
- _TermIndex: u32,
- }
-
- impl SnowWorkerM1 {
- pub fn Default() -> SnowWorkerM1 {
- let options = IdGeneratorOptions::New(1);
- return SnowWorkerM1::New(options);
- }
-
- 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()
- {
- panic!("BaseTime error.");
- } else {
- self.BaseTime = options.BaseTime;
- }
-
- // 2.WorkerIdBitLength
- 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
- };
- }
-
- // 3.WorkerId
- let mut maxWorkerIdNumber = (1 << options.WorkerIdBitLength) - 1;
- if maxWorkerIdNumber == 0 {
- maxWorkerIdNumber = 63;
- }
- if options.WorkerId < 0 || options.WorkerId > maxWorkerIdNumber {
- panic!("WorkerId error. (range:[0, {} ]", maxWorkerIdNumber);
- } else {
- self.WorkerId = options.WorkerId;
- }
-
- // 4.SeqBitLength
- if options.SeqBitLength < 2 || options.SeqBitLength > 21 {
- panic!("SeqBitLength error. (range:[2, 21])");
- } else {
- // self.SeqBitLength = options.SeqBitLength;
- self.SeqBitLength = if options.SeqBitLength <= 0 {
- 6
- } else {
- options.SeqBitLength
- };
- }
-
- // 5.MaxSeqNumber
- let mut maxSeqNumber = (1 << options.SeqBitLength) - 1;
- if options.maxSeqNumber <= 0 {
- maxSeqNumber = 63;
- }
- if options.MaxSeqNumber < 0 || options.MaxSeqNumber > maxSeqNumber {
- panic!("MaxSeqNumber error. (range:[1, {}]", maxSeqNumber);
- } else {
- self.MaxSeqNumber = if options.MaxSeqNumber == 0 {
- maxSeqNumber
- } else {
- options.MaxSeqNumber
- };
- }
-
- // 6.MinSeqNumber
- if options.MinSeqNumber < 5 || options.MinSeqNumber > maxSeqNumber {
- panic!("MinSeqNumber error. (range:[5, {}]", maxSeqNumber);
- } else {
- self.MinSeqNumber = options.MinSeqNumber;
- // self.MinSeqNumber = if options.MinSeqNumber <= 0 { 5 } else { options.MinSeqNumber };
- }
-
- // 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;
-
- if options.Method == 1 {
- sleep(std::time::Duration::from_millis(500));
- }
- }
-
- pub fn New(options: IdGeneratorOptions) -> SnowWorkerM1 {
- let mut worker = SnowWorkerM1 {
- BaseTime: 1582136402000,
- WorkerIdBitLength: 0,
- WorkerId: 0,
- SeqBitLength: 0,
- MaxSeqNumber: 0,
- MinSeqNumber: 0,
- TopOverCostCount: 0,
- _TimestampShift: 0,
- _CurrentSeqNumber: 0,
-
- _LastTimeTick: 0,
- _TurnBackTimeTick: 0,
- _TurnBackIndex: 0,
- _IsOverCost: false,
- _OverCostCountInOneTerm: 0,
- _GenCountInOneTerm: 0,
- _TermIndex: 0,
- };
-
- worker.SetOptions(options);
- return worker;
- }
-
- pub fn NextId(&mut self) -> i64 {
- // println!("SeqBitLength: {}", self.SeqBitLength);
- if self._IsOverCost {
- self.NextOverCostId()
- } else {
- self.NextNormalId()
- }
- }
-
- fn DoGenIdAction(&self, arg: OverCostActionArg) {}
-
- fn BeginOverCostAction(&self, useTimeTick: i64) {}
-
- fn EndOverCostAction(&mut self, useTimeTick: i64) {
- // if self._TermIndex > 10000 {
- // self._TermIndex = 0;
- // }
- }
-
- fn BeginTurnBackAction(&self, useTimeTick: i64) {}
-
- fn EndTurnBackAction(&self, useTimeTick: i64) {}
-
- fn NextOverCostId(&mut self) -> i64 {
- let currentTimeTick = self.GetCurrentTimeTick();
-
- if currentTimeTick > self._LastTimeTick {
- self.EndOverCostAction(currentTimeTick);
-
- self._LastTimeTick = currentTimeTick;
- self._CurrentSeqNumber = self.MinSeqNumber;
- self._IsOverCost = false;
- self._OverCostCountInOneTerm = 0;
- self._GenCountInOneTerm = 0;
-
- return self.CalcId(self._LastTimeTick);
- }
-
- if self._OverCostCountInOneTerm >= self.TopOverCostCount {
- self.EndOverCostAction(currentTimeTick);
-
- self._LastTimeTick = self.GetNextTimeTick();
- self._CurrentSeqNumber = self.MinSeqNumber;
- self._IsOverCost = false;
- self._OverCostCountInOneTerm = 0;
- self._GenCountInOneTerm = 0;
-
- return self.CalcId(self._LastTimeTick);
- }
-
- if self._CurrentSeqNumber > self.MaxSeqNumber {
- self._LastTimeTick += 1;
- self._CurrentSeqNumber = self.MinSeqNumber;
- self._IsOverCost = true;
- self._OverCostCountInOneTerm += 1;
- self._GenCountInOneTerm += 1;
-
- return self.CalcId(self._LastTimeTick);
- }
-
- self._GenCountInOneTerm += 1;
- return self.CalcId(self._LastTimeTick);
- }
-
- fn NextNormalId(&mut self) -> i64 {
- let currentTimeTick = self.GetCurrentTimeTick();
-
- if currentTimeTick < self._LastTimeTick {
- if self._TurnBackTimeTick < 1 {
- self._TurnBackTimeTick = self._LastTimeTick - 1;
- self._TurnBackIndex += 1;
- // 每毫秒序列数的前5位是预留位,0用于手工新值,1-4是时间回拨次序
- // 支持4次回拨次序(避免回拨重叠导致ID重复),可无限次回拨(次序循环使用)。
- if self._TurnBackIndex > 4 {
- self._TurnBackIndex = 1;
- }
- self.BeginTurnBackAction(self._TurnBackTimeTick);
- }
-
- // thread::sleep(std::time::Duration::from_millis(1));
- return self.CalcTurnBackId(self._TurnBackTimeTick);
- }
-
- // 时间追平时,_TurnBackTimeTick清零
- if self._TurnBackTimeTick > 0 {
- self.EndTurnBackAction(self._TurnBackTimeTick);
- self._TurnBackTimeTick = 0;
- }
-
- if currentTimeTick > self._LastTimeTick {
- self._LastTimeTick = currentTimeTick;
- self._CurrentSeqNumber = self.MinSeqNumber;
-
- return self.CalcId(self._LastTimeTick);
- }
-
- if self._CurrentSeqNumber > self.MaxSeqNumber {
- self.BeginOverCostAction(currentTimeTick);
-
- self._TermIndex += 1;
- self._LastTimeTick += 1;
- self._CurrentSeqNumber = self.MinSeqNumber;
- self._IsOverCost = true;
- self._OverCostCountInOneTerm = 1;
- self._GenCountInOneTerm = 1;
-
- return self.CalcId(self._LastTimeTick);
- }
-
- return self.CalcId(self._LastTimeTick);
- }
-
- fn CalcId(&mut self, useTimeTick: i64) -> 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;
- self._TurnBackTimeTick -= 1;
- return result;
- }
-
- fn GetCurrentTimeTick(&self) -> i64 {
- return Utc::now().timestamp_millis() - self.BaseTime;
- }
-
- fn GetNextTimeTick(&self) -> i64 {
- let mut tempTimeTicker = self.GetCurrentTimeTick();
-
- while tempTimeTicker <= self._LastTimeTick {
- // 暂停1ms
- sleep(std::time::Duration::from_millis(1));
- tempTimeTicker = self.GetCurrentTimeTick();
- }
-
- return tempTimeTicker;
- }
- }
|