Skip to main content

snowflake_gen/generator/
decomposition.rs

1use crate::generator::SnowflakeIdGenerator;
2use crate::generator::components::SnowflakeComponents;
3
4impl SnowflakeIdGenerator {
5    /// Decodes a previously generated ID back into its constituent fields.
6    ///
7    /// ```rust
8    /// use snowflake_gen::SnowflakeIdGenerator;
9    ///
10    /// let mut idgen = SnowflakeIdGenerator::new(3, 7).unwrap();
11    /// let id = idgen.generate().unwrap();
12    /// let parts = idgen.decompose(id);
13    ///
14    /// assert_eq!(parts.machine_id, 3);
15    /// assert_eq!(parts.node_id, 7);
16    /// ```
17    pub fn decompose(&self, id: i64) -> SnowflakeComponents {
18        let layout = &self.layout;
19
20        let sequence_mask = layout.max_sequence() as i64;
21        let node_mask = layout.max_node_id() as i64;
22        let machine_mask = layout.max_machine_id() as i64;
23
24        let sequence = (id & sequence_mask) as u32;
25        let node_id = (id >> layout.node_id_shift) & node_mask;
26        let machine_id = (id >> layout.machine_id_shift) & machine_mask;
27        let timestamp_millis = id >> layout.timestamp_shift;
28
29        SnowflakeComponents {
30            timestamp_millis,
31            machine_id,
32            node_id,
33            sequence,
34        }
35    }
36}