diff --git a/Cargo.lock b/Cargo.lock index dba89e5..d6216f5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -82,12 +82,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "nohash-hasher" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" - [[package]] name = "once_cell" version = "1.21.3" @@ -187,10 +181,9 @@ checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rtoml" -version = "0.12.0" +version = "0.13.0" dependencies = [ "ahash", - "nohash-hasher", "pyo3", "serde", "toml", diff --git a/Cargo.toml b/Cargo.toml index af7345a..d2a21f7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,16 +1,15 @@ [package] name = "rtoml" -version = "0.12.0" +version = "0.13.0" authors = ["Samuel Colvin "] edition = "2021" license = "MIT" [dependencies] -toml = {version = "0.5.9", features = ["preserve_order"]} +toml = {version = "0.5.11", features = ["preserve_order"]} serde = "1.0.228" pyo3 = "0.26.0" ahash = "0.8.12" -nohash-hasher = "0.2.0" [lib] name = "_rtoml" diff --git a/src/de.rs b/src/de.rs index 1dc9f53..667446c 100644 --- a/src/de.rs +++ b/src/de.rs @@ -1,6 +1,4 @@ -use std::collections::HashSet; use std::fmt; -use std::hash::BuildHasherDefault; use std::marker::PhantomData; use std::str::FromStr; @@ -8,16 +6,13 @@ use pyo3::prelude::*; use pyo3::types::PyDict; use pyo3::IntoPyObjectExt; -use ahash::RandomState; -use nohash_hasher::NoHashHasher; +use ahash::AHashSet; use serde::de::{self, DeserializeSeed, Deserializer, MapAccess, SeqAccess, Visitor}; use toml::value::Datetime as TomlDatetime; use crate::datetime; pub const DATETIME_MAPPING_KEY: &str = "$__toml_private_datetime"; -type BuildNoHashHasher = BuildHasherDefault>; -pub type NoHashSet = HashSet>; pub struct PyDeserializer<'py> { py: Python<'py>, @@ -116,9 +111,8 @@ impl<'de> Visitor<'de> for PyDeserializer<'_> { Some((first_key, first_value)) => { // we use a hashset to check for duplicate keys, but to avoid cloning the keys, we hash manually // and store that in a no-hash hashset - let hash_builder = RandomState::new(); - let mut key_set = NoHashSet::::with_hasher(BuildHasherDefault::default()); - key_set.insert(hash_builder.hash_one(&first_key)); + let mut key_set = AHashSet::new(); + key_set.insert(first_key.clone()); let dict = PyDict::new(self.py); dict.set_item(first_key, first_value).map_err(de::Error::custom)?; @@ -126,7 +120,7 @@ impl<'de> Visitor<'de> for PyDeserializer<'_> { while let Some((key, value)) = map_access.next_entry_seed(PhantomData::, PyDeserializer::new(self.py, self.none_value))? { - if key_set.insert(hash_builder.hash_one(&key)) { + if key_set.insert(key.clone()) { dict.set_item(key, value).map_err(de::Error::custom)?; } else { return Err(de::Error::custom(format!("duplicate key: `{key}`")));