1use std::sync::OnceLock;
2use std::sync::atomic::{AtomicU64, Ordering};
3use std::time::{SystemTime, UNIX_EPOCH};
4
5pub type PkgID = u64;
6
7pub const DEFAULT_KEY: &str = "_";
8
9static ORDER_COUNTER: AtomicU64 = AtomicU64::new(0);
10static PKG_ID_BASE: OnceLock<u64> = OnceLock::new();
11
12fn pkg_id_base() -> u64 {
13 *PKG_ID_BASE.get_or_init(|| {
14 let secs = SystemTime::now()
15 .duration_since(UNIX_EPOCH)
16 .unwrap_or_default()
17 .as_secs();
18 (secs & 0xFFFF_FFFF) << 24
19 })
20}
21
22pub fn gen_pkg_id() -> u64 {
23 pkg_id_base() + ORDER_COUNTER.fetch_add(1, Ordering::Relaxed)
24}
25
26#[cfg(test)]
27mod tests {
28 use crate::pkg::gen_pkg_id;
29
30 #[test]
31 fn test_gen_id() {
32 let a = gen_pkg_id();
33 let b = gen_pkg_id();
34 assert_ne!(a, b);
35 println!("{},{}", a, b);
36 }
37}