9 releases (4 breaking)

0.5.0 Feb 27, 2023
0.4.2 Feb 19, 2023
0.3.2 Jan 10, 2023
0.2.0 Jan 9, 2023
0.1.0 Jan 9, 2023

#1063 in Web programming

Download history 62/week @ 2023-02-02 39/week @ 2023-02-09 64/week @ 2023-02-16 35/week @ 2023-02-23 3/week @ 2023-03-02 1/week @ 2023-03-09 1/week @ 2023-03-16 11/week @ 2023-03-23 7/week @ 2023-03-30 20/week @ 2023-04-06 13/week @ 2023-04-13 15/week @ 2023-04-20 3/week @ 2023-04-27 39/week @ 2023-05-04 17/week @ 2023-05-11 9/week @ 2023-05-18

68 downloads per month

MIT license

17KB
299 lines

Hexafreeze

A library to asynchronously generate Snowflake IDs.

What is a snowflake

Snowflakes were developed by twitter for creating time sortable ids, which are able to be quickly generated without syncronisation even in distributed compute clusters.

Snowflakes have the following layout:

Snowflake ID layout

Usage

First you need to include dependencies. These are the recommended features. Tokio may be slimmed down by enabling individual features instead of full.

[dependencies]
hexafreeze = "0.5"
tokio = {version = "1", features = ["full"]}

[Generator] is the interface for the generation of snowflakes. Snowflakes require an epoch, basically the start time of the Snowflake, it needs to be in the past and be less than ~ 69 years ago. [DEFAULT_EPOCH] should be fine for most applications until 2079. It is thread-safe, therefore you do not need a Mutex to contain it. It is recommend to use the same generator in all places in a rust application, something like once_cell may be useful for this.

use hexafreeze::Generator;
use hexafreeze::DEFAULT_EPOCH;

#[tokio::main]
async fn main() {
    // If your system is not distributed using `0` as the `node_id` is perfectly fine.
    // The `DEFAULT_EPOCH` always needs to be dereferenced.
    let gen = Generator::new(0, *DEFAULT_EPOCH).unwrap();

    // The `generate` function is async and non-blocking.
    let id: i64 = gen.generate().await.unwrap();
}

Details

  • Unlike Twitter's reference implementation, the sequence does not get reset every millisecond.

Dependencies

~3.5–8.5MB
~136K SLoC