uid.rs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. use std::time::SystemTime;
  2. const EPOCH: u64 = 1637806706000;
  3. const NODE_ID_BITS: u64 = 10;
  4. const SEQUENCE_BITS: u64 = 12;
  5. const NODE_ID_SHIFT: u64 = SEQUENCE_BITS;
  6. const TIMESTAMP_SHIFT: u64 = NODE_ID_BITS + SEQUENCE_BITS;
  7. const SEQUENCE_MASK: u64 = (1 << SEQUENCE_BITS) - 1;
  8. pub struct UserIDGenerator {
  9. node_id: u64,
  10. sequence: u64,
  11. last_timestamp: u64,
  12. }
  13. impl UserIDGenerator {
  14. pub fn new(node_id: u64) -> UserIDGenerator {
  15. UserIDGenerator {
  16. node_id,
  17. sequence: 0,
  18. last_timestamp: 0,
  19. }
  20. }
  21. pub fn next_id(&mut self) -> i64 {
  22. let timestamp = self.timestamp();
  23. if timestamp < self.last_timestamp {
  24. panic!("Clock moved backwards!");
  25. }
  26. if timestamp == self.last_timestamp {
  27. self.sequence = (self.sequence + 1) & SEQUENCE_MASK;
  28. if self.sequence == 0 {
  29. self.wait_next_millis();
  30. }
  31. } else {
  32. self.sequence = 0;
  33. }
  34. self.last_timestamp = timestamp;
  35. let id = (timestamp - EPOCH) << TIMESTAMP_SHIFT | self.node_id << NODE_ID_SHIFT | self.sequence;
  36. id as i64
  37. }
  38. fn wait_next_millis(&self) {
  39. let mut timestamp = self.timestamp();
  40. while timestamp == self.last_timestamp {
  41. timestamp = self.timestamp();
  42. }
  43. }
  44. fn timestamp(&self) -> u64 {
  45. SystemTime::now()
  46. .duration_since(SystemTime::UNIX_EPOCH)
  47. .expect("Clock moved backwards!")
  48. .as_millis() as u64
  49. }
  50. }