snowflake-id-generator 0.4.0

Simple snowflake id implementation
Documentation
use crate::single_thread::sync_generator::SnowflakeGenerator as STSG;
use crate::multi_thread::sync_generator::SnowflakeGenerator as MTSG;
use crate::multi_thread::async_generator::SnowflakeGenerator as MTAG;

#[test]
fn test_single_thread_snowflake_id_generation() {
    let generator = STSG::new(0, 1).unwrap();
    let id1 = generator.generate_id();
    let id2 = generator.generate_id();
    let decomposed1 = generator.decompose(id1);
    let decomposed2 = generator.decompose(id2);
    println!("ID1: {}, ID2: {}", id1, id2);
    println!("Decomposed1: {:?}, Decomposed2: {:?}", decomposed1, decomposed2);
    assert!(id2 > id1);
}

#[tokio::test]
async fn test_multi_thread_async_snowflake_id_generation() {
    let generator = MTAG::new(0, 1).unwrap();

    let handle1 = {
        let gen_clone = generator.clone();
        tokio::spawn(async move {
            gen_clone.generate_id().await
        })
    };

    let handle2 = {
        let gen_clone = generator.clone();
        tokio::spawn(async move {
            gen_clone.generate_id().await
        })
    };
    let id1 = handle1.await.unwrap();
    let id2 = handle2.await.unwrap();
    let decomposed1 = generator.decompose(id1).await;
    let decomposed2 = generator.decompose(id2).await;

    println!("ID1: {}, ID2: {}", id1, id2);
    println!("Decomposed1: {:?}, Decomposed2: {:?}", decomposed1, decomposed2);
    assert!(id2 != id1);
}

#[test]
fn test_multi_thread_sync_snowflake_id_generation() {
    use std::thread;
    let generator = MTSG::new(0, 1).unwrap();

    let handle1 = {
        let gen_clone = generator.clone();
        thread::spawn(move || {
            gen_clone.generate_id()
        })
    };

    let handle2 = {
        let gen_clone = generator.clone();
        thread::spawn(move || {
            gen_clone.generate_id()
        })
    };
    let id1 = handle1.join().unwrap();
    let id2 = handle2.join().unwrap();
    let decomposed1 = generator.decompose(id1);
    let decomposed2 = generator.decompose(id2);

    println!("ID1: {}, ID2: {}", id1, id2);
    println!("Decomposed1: {:?}, Decomposed2: {:?}", decomposed1, decomposed2);

    assert!(id2 != id1);
}

#[test]
fn bench_single_thread_snowflake_id_generation() {
    let generator = STSG::new(0, 1).unwrap();
    let ids = 1_000_000;
    let time = std::time::Instant::now();
    for _ in 0..ids {
        generator.generate_id();
    }
    let elapsed = time.elapsed();
    println!("Generated {} IDs in {:?}", ids, elapsed);
    println!("({:.2} IDs/ms)", ids as f64 / elapsed.as_millis() as f64);
}

#[tokio::test]
async fn bench_multi_thread_async_snowflake_id_generation() {
    use std::thread;
    let generator = MTAG::new(0, 1).unwrap();
    let ids_per_thread = 100_000;
    let threads = 10;
    let time = std::time::Instant::now();
    let mut handles = vec![];
    for _ in 0..threads {
        let gen_clone = generator.clone();
        let handle = thread::spawn(async move || {
            for _ in 0..ids_per_thread {
                gen_clone.generate_id().await;
            }
        });
        handles.push(handle);
    }
    for handle in handles {
        handle.join().unwrap().await;
    }
    let elapsed = time.elapsed();
    println!("Generated {} IDs in {:?}", ids_per_thread * threads, elapsed);
    println!("({:.2} IDs/ms)", (ids_per_thread * threads) as f64 / elapsed.as_millis() as f64);
}

#[test]
fn bench_multi_thread_sync_snowflake_id_generation() {
    use std::thread;
    let generator = MTSG::new(0, 1).unwrap();
    let ids_per_thread = 100_000;
    let threads = 10;
    let time = std::time::Instant::now();
    let mut handles = vec![];
    for _ in 0..threads {
        let gen_clone = generator.clone();
        let handle = thread::spawn(move || {
            for _ in 0..ids_per_thread {
                gen_clone.generate_id();
            }
        });
        handles.push(handle);
    }
    for handle in handles {
        handle.join().unwrap();
    }
    let elapsed = time.elapsed();
    println!("Generated {} IDs in {:?}", ids_per_thread * threads, elapsed);
    println!("({:.2} IDs/ms)", (ids_per_thread * threads) as f64 / elapsed.as_millis() as f64);
}