Skip to content

A simple to use rust package to generate or parse Twitter snowflake IDs,generate time sortable 64 bits unique ids for distributed systems (inspired from twitter snowflake)

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT
Notifications You must be signed in to change notification settings

houseme/snowflake-rs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

b2bee6a · Oct 16, 2024

History

69 Commits
Oct 14, 2024
Oct 17, 2023
Oct 10, 2024
Oct 4, 2022
Oct 16, 2024
Oct 16, 2024
Oct 16, 2024
Oct 3, 2022
Oct 4, 2022
Oct 16, 2024
Oct 3, 2022
Oct 4, 2022
Mar 3, 2024

Repository files navigation

Snowflake-rs

A simple to use rust package to generate or parse Twitter snowflake IDs, generate time sortable 64-bit unique ids for distributed systems (inspired from twitter snowflake)

Build crates.io docs.rs License

A distributed unique ID generator inspired by Twitter's Snowflake.

This is a Rust implementation of the original houseme/snowflake, which is written in Go.

A Snowflake ID is composed of

  • 39 bits for time in units of 10 msec
  • 8 bits for a sequence number
  • 8 bits for a data center id
  • 8 bits for a machine id

Install

Add the following to your Cargo.toml:

[dependencies]
snowflake_me = "0.3"

Quickstart

use snowflake_me::Snowflake;

let sf = Snowflake::new().unwrap();
let next_id = sf.next_id().unwrap();
println!("{}", next_id);

Customize the start time

use snowflake_me::Snowflake;
use chrono::prelude::*;

let sf = Snowflake::builder().start_time(Utc::now()).finalize().unwrap();
let next_id = sf.next_id().unwrap();
println!("{}", next_id);

Customize the machine ID

use snowflake_me::Snowflake;

let sf = Snowflake::builder().machine_id( & | | Ok(42)).finalize().unwrap();
let next_id = sf.next_id().unwrap();
println!("{}", next_id);

Customize the datacenter ID

use snowflake_me::Snowflake;

let sf = Snowflake::builder().data_center_id( & | | Ok(42)).finalize().unwrap();
let next_id = sf.next_id().unwrap();
println!("{}", next_id);

Resolve ID

use snowflake_me::{decompose, Snowflake};

let sf = Snowflake::new().unwrap();
let next_id = sf.next_id().unwrap();

let parts = decompose(next_id);
println!("timestamp: {}, machine_id: {}, sequence: {}, data_center_id:{}", parts.time, parts.machine_id, parts.sequence, parts.data_center_id);

Benchmarks

Run them yourself with cargo bench.

1, Benchmarks were run on a MacBook Pro (16-inch, 2019) with a 2,4GHz i9 and 64 GB memory.

test bench_decompose ... bench:         651 ns/iter (+/- 251)
test bench_new       ... bench:     795,722 ns/iter (+/- 371,556)
test bench_next_id   ... bench:      36,652 ns/iter (+/- 1,105)

2, Benchmarks were run on a MacBook Pro (15-inch, 2017) with a 2,8GHz i7 and 16 GB memory.

test bench_decompose ... bench:       1,066 ns/iter (+/- 132)
test bench_new       ... bench:     738,129 ns/iter (+/- 318,192)
test bench_next_id   ... bench:      37,390 ns/iter (+/- 499)

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

About

A simple to use rust package to generate or parse Twitter snowflake IDs,generate time sortable 64 bits unique ids for distributed systems (inspired from twitter snowflake)

Topics

Resources

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT

Stars

Watchers

Forks

Packages

No packages published

Languages