1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
use uuid::Uuid; #[derive(PartialEq, Debug)] pub struct Id { uuid_as_128: u128, c: u8, } impl Id { pub fn get(&self) -> (u128, u8) { (self.uuid_as_128, self.c) } } pub struct HyperId { uuid: Uuid, c: u8, } impl HyperId { pub fn new() -> Self { let uuid = Uuid::new_v4(); let c: u8 = 0; Self { uuid, c } } pub fn get(&self) -> Id { Id { uuid_as_128: self.uuid.as_u128(), c: self.c, } } pub fn generate(&mut self) -> Id { self.c = self.c.checked_add(1).unwrap_or(0); if self.c == 0 { self.uuid = Uuid::new_v4(); } Id { uuid_as_128: self.uuid.as_u128(), c: self.c, } } } impl Default for HyperId { fn default() -> Self { Self::new() } } #[cfg(test)] mod tests { use super::*; #[test] fn starts_from_zero() { let hyperid = HyperId::default(); assert_eq!(hyperid.c, 0); } #[test] fn get_return_equal_id() { let hyperid = HyperId::default(); assert_eq!(hyperid.get(), hyperid.get()); } #[test] fn generate_change_internal_state() { let mut hyperid = HyperId::default(); let c = hyperid.c; hyperid.generate(); assert_ne!(hyperid.c, c); } #[test] fn generate_returns_different_id() { let mut hyperid = HyperId::default(); let previous_id = hyperid.get(); let next_id = hyperid.generate(); assert_ne!(previous_id, next_id); } #[test] fn on_255_generate_a_new_base() { let mut hyperid = HyperId::default(); let base = hyperid.uuid; for _ in 0..255 { hyperid.generate(); } let new_base = hyperid.uuid; assert_eq!(base, new_base); hyperid.generate(); let new_base = hyperid.uuid; assert_ne!(base, new_base); } #[test] fn different_instances_have_different_base() { let hyperid1 = HyperId::default(); let hyperid2 = HyperId::default(); assert_ne!(hyperid1.uuid, hyperid2.uuid); } }