You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

snow_worker_m1.rs 10 kB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
2 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
2 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
2 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. /*
  2. * 版权属于:yitter(yitter@126.com)
  3. * 开源地址:https://github.com/yitter/idgenerator
  4. */
  5. use crate::idgen::*;
  6. use chrono::Utc;
  7. use std::thread;
  8. use std::thread::sleep;
  9. // use lazy_static::lazy_static;
  10. pub struct SnowWorkerM1 {
  11. ///基础时间
  12. pub BaseTime: i64,
  13. ///机器码
  14. pub WorkerId: u32,
  15. ///机器码位长
  16. pub WorkerIdBitLength: u8,
  17. ///自增序列数位长
  18. pub SeqBitLength: u8,
  19. ///最大序列数(含)
  20. pub MaxSeqNumber: u32,
  21. ///最小序列数(含)
  22. pub MinSeqNumber: u32,
  23. ///最大漂移次数
  24. pub TopOverCostCount: u32,
  25. _TimestampShift: u8,
  26. _CurrentSeqNumber: u32,
  27. _LastTimeTick: i64,
  28. _TurnBackTimeTick: i64,
  29. _TurnBackIndex: u8,
  30. _IsOverCost: bool,
  31. _OverCostCountInOneTerm: u32,
  32. _GenCountInOneTerm: u32,
  33. _TermIndex: u32,
  34. }
  35. impl SnowWorkerM1 {
  36. pub fn Default() -> SnowWorkerM1 {
  37. let options = IdGeneratorOptions::New(1);
  38. return SnowWorkerM1::New(options);
  39. }
  40. pub fn SetOptions(&mut self, options: IdGeneratorOptions) {
  41. // 1.BaseTime
  42. if options.BaseTime == 0 {
  43. self.BaseTime = 1582136402000;
  44. } else if options.BaseTime < 631123200000
  45. || options.BaseTime > Utc::now().timestamp_millis()
  46. {
  47. panic!("BaseTime error.");
  48. } else {
  49. self.BaseTime = options.BaseTime;
  50. }
  51. // 2.WorkerIdBitLength
  52. if options.WorkerIdBitLength <= 0 {
  53. panic!("WorkerIdBitLength error.(range:[1, 21])");
  54. }
  55. if options.SeqBitLength + options.WorkerIdBitLength > 22 {
  56. panic!("error:WorkerIdBitLength + SeqBitLength <= 22");
  57. } else {
  58. // self.WorkerIdBitLength = options.WorkerIdBitLength;
  59. self.WorkerIdBitLength = if options.WorkerIdBitLength <= 0 {
  60. 6
  61. } else {
  62. options.WorkerIdBitLength
  63. };
  64. }
  65. // 3.WorkerId
  66. let mut maxWorkerIdNumber = (1 << options.WorkerIdBitLength) - 1;
  67. if maxWorkerIdNumber == 0 {
  68. maxWorkerIdNumber = 63;
  69. }
  70. if options.WorkerId < 0 || options.WorkerId > maxWorkerIdNumber {
  71. panic!("WorkerId error. (range:[0, {} ]", maxWorkerIdNumber);
  72. } else {
  73. self.WorkerId = options.WorkerId;
  74. }
  75. // 4.SeqBitLength
  76. if options.SeqBitLength < 2 || options.SeqBitLength > 21 {
  77. panic!("SeqBitLength error. (range:[2, 21])");
  78. } else {
  79. // self.SeqBitLength = options.SeqBitLength;
  80. self.SeqBitLength = if options.SeqBitLength <= 0 {
  81. 6
  82. } else {
  83. options.SeqBitLength
  84. };
  85. }
  86. // 5.MaxSeqNumber
  87. let mut maxSeqNumber = (1 << options.SeqBitLength) - 1;
  88. if options.maxSeqNumber <= 0 {
  89. maxSeqNumber = 63;
  90. }
  91. if options.MaxSeqNumber < 0 || options.MaxSeqNumber > maxSeqNumber {
  92. panic!("MaxSeqNumber error. (range:[1, {}]", maxSeqNumber);
  93. } else {
  94. self.MaxSeqNumber = if options.MaxSeqNumber == 0 {
  95. maxSeqNumber
  96. } else {
  97. options.MaxSeqNumber
  98. };
  99. }
  100. // 6.MinSeqNumber
  101. if options.MinSeqNumber < 5 || options.MinSeqNumber > maxSeqNumber {
  102. panic!("MinSeqNumber error. (range:[5, {}]", maxSeqNumber);
  103. } else {
  104. self.MinSeqNumber = options.MinSeqNumber;
  105. // self.MinSeqNumber = if options.MinSeqNumber <= 0 { 5 } else { options.MinSeqNumber };
  106. }
  107. // 7.TopOverCostCount
  108. //self.TopOverCostCount = if options.TopOverCostCount == 0 { 2000 } else { options.TopOverCostCount };
  109. if options.TopOverCostCount < 0 || options.TopOverCostCount > 10000 {
  110. panic!("TopOverCostCount error. (range:[0, 10000]");
  111. } else {
  112. self.TopOverCostCount = options.TopOverCostCount;
  113. }
  114. // 8.Others
  115. self._TimestampShift = self.WorkerIdBitLength + self.SeqBitLength;
  116. self._CurrentSeqNumber = self.MinSeqNumber;
  117. if options.Method == 1 {
  118. sleep(std::time::Duration::from_millis(500));
  119. }
  120. }
  121. pub fn New(options: IdGeneratorOptions) -> SnowWorkerM1 {
  122. let mut worker = SnowWorkerM1 {
  123. BaseTime: 1582136402000,
  124. WorkerIdBitLength: 0,
  125. WorkerId: 0,
  126. SeqBitLength: 0,
  127. MaxSeqNumber: 0,
  128. MinSeqNumber: 0,
  129. TopOverCostCount: 0,
  130. _TimestampShift: 0,
  131. _CurrentSeqNumber: 0,
  132. _LastTimeTick: 0,
  133. _TurnBackTimeTick: 0,
  134. _TurnBackIndex: 0,
  135. _IsOverCost: false,
  136. _OverCostCountInOneTerm: 0,
  137. _GenCountInOneTerm: 0,
  138. _TermIndex: 0,
  139. };
  140. worker.SetOptions(options);
  141. return worker;
  142. }
  143. pub fn NextId(&mut self) -> i64 {
  144. // println!("SeqBitLength: {}", self.SeqBitLength);
  145. if self._IsOverCost {
  146. self.NextOverCostId()
  147. } else {
  148. self.NextNormalId()
  149. }
  150. }
  151. fn DoGenIdAction(&self, arg: OverCostActionArg) {}
  152. fn BeginOverCostAction(&self, useTimeTick: i64) {}
  153. fn EndOverCostAction(&mut self, useTimeTick: i64) {
  154. // if self._TermIndex > 10000 {
  155. // self._TermIndex = 0;
  156. // }
  157. }
  158. fn BeginTurnBackAction(&self, useTimeTick: i64) {}
  159. fn EndTurnBackAction(&self, useTimeTick: i64) {}
  160. fn NextOverCostId(&mut self) -> i64 {
  161. let currentTimeTick = self.GetCurrentTimeTick();
  162. if currentTimeTick > self._LastTimeTick {
  163. self.EndOverCostAction(currentTimeTick);
  164. self._LastTimeTick = currentTimeTick;
  165. self._CurrentSeqNumber = self.MinSeqNumber;
  166. self._IsOverCost = false;
  167. self._OverCostCountInOneTerm = 0;
  168. self._GenCountInOneTerm = 0;
  169. return self.CalcId(self._LastTimeTick);
  170. }
  171. if self._OverCostCountInOneTerm >= self.TopOverCostCount {
  172. self.EndOverCostAction(currentTimeTick);
  173. self._LastTimeTick = self.GetNextTimeTick();
  174. self._CurrentSeqNumber = self.MinSeqNumber;
  175. self._IsOverCost = false;
  176. self._OverCostCountInOneTerm = 0;
  177. self._GenCountInOneTerm = 0;
  178. return self.CalcId(self._LastTimeTick);
  179. }
  180. if self._CurrentSeqNumber > self.MaxSeqNumber {
  181. self._LastTimeTick += 1;
  182. self._CurrentSeqNumber = self.MinSeqNumber;
  183. self._IsOverCost = true;
  184. self._OverCostCountInOneTerm += 1;
  185. self._GenCountInOneTerm += 1;
  186. return self.CalcId(self._LastTimeTick);
  187. }
  188. self._GenCountInOneTerm += 1;
  189. return self.CalcId(self._LastTimeTick);
  190. }
  191. fn NextNormalId(&mut self) -> i64 {
  192. let currentTimeTick = self.GetCurrentTimeTick();
  193. if currentTimeTick < self._LastTimeTick {
  194. if self._TurnBackTimeTick < 1 {
  195. self._TurnBackTimeTick = self._LastTimeTick - 1;
  196. self._TurnBackIndex += 1;
  197. // 每毫秒序列数的前5位是预留位,0用于手工新值,1-4是时间回拨次序
  198. // 支持4次回拨次序(避免回拨重叠导致ID重复),可无限次回拨(次序循环使用)。
  199. if self._TurnBackIndex > 4 {
  200. self._TurnBackIndex = 1;
  201. }
  202. self.BeginTurnBackAction(self._TurnBackTimeTick);
  203. }
  204. // thread::sleep(std::time::Duration::from_millis(1));
  205. return self.CalcTurnBackId(self._TurnBackTimeTick);
  206. }
  207. // 时间追平时,_TurnBackTimeTick清零
  208. if self._TurnBackTimeTick > 0 {
  209. self.EndTurnBackAction(self._TurnBackTimeTick);
  210. self._TurnBackTimeTick = 0;
  211. }
  212. if currentTimeTick > self._LastTimeTick {
  213. self._LastTimeTick = currentTimeTick;
  214. self._CurrentSeqNumber = self.MinSeqNumber;
  215. return self.CalcId(self._LastTimeTick);
  216. }
  217. if self._CurrentSeqNumber > self.MaxSeqNumber {
  218. self.BeginOverCostAction(currentTimeTick);
  219. self._TermIndex += 1;
  220. self._LastTimeTick += 1;
  221. self._CurrentSeqNumber = self.MinSeqNumber;
  222. self._IsOverCost = true;
  223. self._OverCostCountInOneTerm = 1;
  224. self._GenCountInOneTerm = 1;
  225. return self.CalcId(self._LastTimeTick);
  226. }
  227. return self.CalcId(self._LastTimeTick);
  228. }
  229. fn CalcId(&mut self, useTimeTick: i64) -> i64 {
  230. let result = (useTimeTick << self._TimestampShift)
  231. + (self.WorkerId << self.SeqBitLength) as i64
  232. + (self._CurrentSeqNumber) as i64;
  233. self._CurrentSeqNumber += 1;
  234. return result;
  235. }
  236. fn CalcTurnBackId(&mut self, useTimeTick: i64) -> i64 {
  237. let result = (useTimeTick << self._TimestampShift)
  238. + (self.WorkerId << self.SeqBitLength) as i64
  239. + (self._TurnBackIndex) as i64;
  240. self._TurnBackTimeTick -= 1;
  241. return result;
  242. }
  243. fn GetCurrentTimeTick(&self) -> i64 {
  244. return Utc::now().timestamp_millis() - self.BaseTime;
  245. }
  246. fn GetNextTimeTick(&self) -> i64 {
  247. let mut tempTimeTicker = self.GetCurrentTimeTick();
  248. while tempTimeTicker <= self._LastTimeTick {
  249. // 暂停1ms
  250. sleep(std::time::Duration::from_millis(1));
  251. tempTimeTicker = self.GetCurrentTimeTick();
  252. }
  253. return tempTimeTicker;
  254. }
  255. }