Crate ids_service

source ·
Expand description

Library that allows generating unique ids. It tried to keep cache filled using background threads to fill it. If the cache is empty (the number of requests is too high) an id is calculated on the fly. This will slow down obtaining the id but there is no error when the cache is empty. To generate unique ids the library uses an array of bytes with values from a random number generator and a timestamp as nanoseconds since January 1, 1970 UTC and finally create an hash from both data’s.

The library is composed of two modules with similar API but different hash algorithms:

crypto_hash:

The hash algorithm can be one from crypto::sha3::Sha3Mode.

rust_hash:

The hash algorithm is the std::collections::hash_map::DefaultHasher from Rust sdt.

According to your requirements, you may choose which modules you need. The negative impact of using crypto_hash is the performance and resources to run service. Throughput of ids/sec is about half compared to rust DefaultHasher. The indicative throughput with an Intel I7 using sha512 is above 750’000 ids/sec using Rust Hash the throughput is above 900’000 ids/sec.

The size of random block is equal to 2 * the size of hash sha512 = 128 bytes. The size of data block to calculate an unique id using sha512 equal 128 bytes random + 8 bytes of timestamp.

The id can be encode as:

  • String encoded hexadecimal lower case
  • String as Base64
  • String as Base32
  • Json

Quick Start

crypto_hash:

extern crate ids_service;

use crate::ids_service::crypto_hash::*;
use crate::ids_service::common::*;

fn main() {

    /*
     * Create an ids service with:
     * Cache size = 100'000
     * hash algo. = sha256
     * A pool of threads = to the cpu numbers
     */
    let mut ids = IdsService::default();
    ids.start();
    // Optional: Wait cache is filled at 10%
    ids.filled_at_percent_event(10).recv().is_ok();
    println!("Get an id: {}", ids.get_id().as_hex());
    println!("Get another id: {}", ids.get_id().as_base64());
    println!("Get an id from cache: {}", ids.get_id_from_cache().expect("Expect an id").as_hex());
    println!("Current numbers of items in cache: {}", ids.get_cache_len());
    // Graceful Shutdown and Cleanup
    ids.stop();
}

Create an hash without caching service

extern crate ids_service;

use crate::ids_service::crypto_hash::*;

fn main() {

    println!("Create an id sha512 without the service: {}", create_id_as_sha512());
    println!("Create an id sha256 without the service: {}", create_id_as_sha256());

}

The lib use simplelog see for configuration: crates.io Rust Package Registry SimpleLog .

rust_hash:

extern crate ids_service;

use crate::ids_service::rust_hash::*;
use crate::ids_service::common::*;


fn main() {

    /*
     * Create an ids service with:
     * Cache size = 100'000
     * hash algo. = rust SipHasher
     * A pool of threads = to the cpu numbers
     */
    let mut ids = IdsService::default();
    ids.start();
    // Optional: Wait cache is filled at 100%
    ids.filled_event().recv().is_ok();
    println!("Get an id: {}", ids.get_id());
    println!("Get an id: {}", ids.get_id().as_hex());
    println!("Get an id: {}", ids.get_id().as_base64());
    println!("Get an id: {}", ids.get_id().as_json());
    println!("Get an id from cache: {}", ids.get_id_from_cache().expect("Expect an id"));
    println!("Current numbers of items in cache: {}", ids.get_cache_len());
    // Graceful Shutdown and Cleanup
    ids.stop();
}

Create an hash without caching service


extern crate ids_service;

use crate::ids_service::rust_hash::*;

fn main() {

    println!("Create an id without the service: {}", create_id().unwrap());
    println!("Create an id without the service: {}", create_id().unwrap());

}

Re-exports

pub use self::crypto_hash::*;
pub use self::rust_hash::*;

Modules

Module with shared part of lib.