Customizable and thread-safe distributed id generator, like twitter's snowflake.
```rust use frostflake::{Generator, GeneratorOptions}; use std::thread;
let generator = Generator::new(GeneratorOptions::default());
{ // generator can be shared with threads by std::sync::Arc let generator = generator.clone(); thread::spawn(move || { let mut generator = generator.lock().unwrap(); let id = generator.generate(); }).join(); } ```
```rust use frostflake::{GeneratorPool, GeneratorPoolOptions}; use std::thread;
// create 10 generators let pool = GeneratorPool::new(10, GeneratorPoolOptions::default());
{ // pool also can be shared with threads by std::sync::Arc let pool = pool.clone(); thread::spawn(move || { let id = pool.generate(); }).join(); } ```
frostflake is highly configurable.
```rust use frostflake::{Generator, GeneratorOptions};
let opts = GeneratorOptions::default() .bits(42, 10, 12) // 42bit timestamp, 10bit node, 12bit sequence .base_ts(1483228800000) // base time 2017-01-01T00:00:00Z as milliseonds .node(3); // node number
let generator = Generator::new(opts); ```
Also, time function is can be set. If you want to use plain seconds unit instead of millisedond, you can do by this:
```rust use frostflake::{Generator, GeneratorOptions}; use std::time::{SystemTime, UNIX_EPOCH};
fn mytime() -> u64 { let t = SystemTime::now().durationsince(UNIXEPOCH).unwrap(); t.assecs() }
// use smaller time bits (because this is not milliseconds) // use larger sequence bits let opts = GeneratorOptions::default() .basets(0) // need this for avoid exceeding time value on smaller bit size .bits(36, 10, 18) .basets(1483228800) // base time should be second too .timefn(mytime); // set my time function
let generator = Generator::new(opts); ```
|Options| Default value| |---|---| |bits| 42=timestamp, 10=node, 12=sequence | |base_ts|1483228800000 (2017-01-01T00:00:00Z as milliseonds)| |node|0| |time_fn|return current milliseonds|
Almost same as Generator, but GeneratorPool uses pool_id
bit for distinguish each pools.
So default bit widths is:
|Options| Default value| |---|---| |bits| 42=timestamp, 4=pool_id, 6=node, 12=sequence |
All other options are same with Generator.