diff --git a/Cargo.lock b/Cargo.lock index 66a3a895..d3605105 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -141,6 +141,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "atomic" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" + [[package]] name = "atomic-write-file" version = "0.1.2" @@ -3758,6 +3764,7 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" dependencies = [ + "atomic", "getrandom", "serde", ] diff --git a/Cargo.toml b/Cargo.toml index 5cb98774..b245d259 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,7 +39,7 @@ semver = "1.0.20" serde = { version = "1.0.193", features = ["derive"] } serde_json = "1.0.108" tokio = { version = "1", features = ["full"] } -uuid = { version = "1.3", features = ["v4", "serde"] } +uuid = { version = "1.3", features = ["v4", "v7", "serde"] } whoami = "1.1.2" typed-builder = "0.18.0" pretty_assertions = "1.3.0" diff --git a/atuin-common/src/utils.rs b/atuin-common/src/utils.rs index 8358802a..59050b96 100644 --- a/atuin-common/src/utils.rs +++ b/atuin-common/src/utils.rs @@ -12,36 +12,8 @@ pub fn random_bytes() -> [u8; N] { ret } -// basically just ripped from the uuid crate. they have it as unstable, but we can use it fine. -const fn encode_unix_timestamp_millis(millis: u64, random_bytes: &[u8; 10]) -> Uuid { - let millis_high = ((millis >> 16) & 0xFFFF_FFFF) as u32; - let millis_low = (millis & 0xFFFF) as u16; - - let random_and_version = - (random_bytes[0] as u16 | ((random_bytes[1] as u16) << 8) & 0x0FFF) | (0x7 << 12); - - let mut d4 = [0; 8]; - - d4[0] = (random_bytes[2] & 0x3F) | 0x80; - d4[1] = random_bytes[3]; - d4[2] = random_bytes[4]; - d4[3] = random_bytes[5]; - d4[4] = random_bytes[6]; - d4[5] = random_bytes[7]; - d4[6] = random_bytes[8]; - d4[7] = random_bytes[9]; - - Uuid::from_fields(millis_high, millis_low, random_and_version, &d4) -} - pub fn uuid_v7() -> Uuid { - let bytes = random_bytes(); - let now: u64 = u64::try_from( - time::OffsetDateTime::now_utc().unix_timestamp_nanos() / 1_000_000, - ) - .expect("Either you're in the past (1970) - or your in the far future (2554). Good for you"); - - encode_unix_timestamp_millis(now, &bytes) + Uuid::now_v7() } pub fn uuid_v4() -> String {