From 38670dd253695950a9c2d9f93f3314f070625e4f Mon Sep 17 00:00:00 2001 From: Alisa Sireneva Date: Sun, 28 Dec 2025 19:39:14 +0300 Subject: [PATCH 1/7] Use shrink_to_fit from hashbrown --- src/lib.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 2a9c6206..1b9b7df8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1094,9 +1094,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> DashMap fn _shrink_to_fit(&self) { self.shards.iter().for_each(|s| { - let mut shard = s.write(); - let size = shard.len(); - shard.shrink_to(size, |(k, _v)| { + s.write().shrink_to_fit(|(k, _v)| { let mut hasher = self.hasher.build_hasher(); k.hash(&mut hasher); hasher.finish() From 991de6734fd8461f7673ce7b5ddd299586ffcb41 Mon Sep 17 00:00:00 2001 From: Alisa Sireneva Date: Sun, 28 Dec 2025 19:39:24 +0300 Subject: [PATCH 2/7] Use clear from hashbrown --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 1b9b7df8..31ec5fac 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1259,7 +1259,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> DashMap } fn _clear(&self) { - self._retain(|_, _| false) + self.shards.iter().for_each(|s| s.write().clear()); } fn _contains_key(&'a self, key: &Q) -> bool From c0360a62be3dc533316e38807c888bc9fa346401 Mon Sep 17 00:00:00 2001 From: Alisa Sireneva Date: Sun, 28 Dec 2025 19:40:13 +0300 Subject: [PATCH 3/7] Use usize::BITS instead of manual arithmetic --- src/lib.rs | 2 +- src/util.rs | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 31ec5fac..f1014ade 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -266,7 +266,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: BuildHasher + Clone> DashMap { assert!(shard_amount > 1); assert!(shard_amount.is_power_of_two()); - let shift = util::ptr_size_bits() - ncb(shard_amount); + let shift = usize::BITS as usize - ncb(shard_amount); if capacity != 0 { capacity = (capacity + (shard_amount - 1)) & !(shard_amount - 1); diff --git a/src/util.rs b/src/util.rs index 6464aa6d..3b0aee27 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,12 +1,8 @@ -use core::{mem, ptr}; +use core::ptr; use std::{marker::PhantomData, mem::ManuallyDrop}; use lock_api::{RawRwLock, RawRwLockDowngrade, RwLockReadGuard, RwLockWriteGuard}; -pub const fn ptr_size_bits() -> usize { - mem::size_of::() * 8 -} - pub fn map_in_place_2 T>((k, v): (U, &mut T), f: F) { unsafe { // # Safety From 80789ca6a9453cf8cb8f77e69c4e54468d2accf5 Mon Sep 17 00:00:00 2001 From: Alisa Sireneva Date: Sun, 28 Dec 2025 19:40:58 +0300 Subject: [PATCH 4/7] Simplify capacity calculation --- src/lib.rs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index f1014ade..d8adf642 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -259,7 +259,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: BuildHasher + Clone> DashMap { /// mappings.insert(8, 16); /// ``` pub fn with_capacity_and_hasher_and_shard_amount( - mut capacity: usize, + capacity: usize, hasher: S, shard_amount: usize, ) -> Self { @@ -267,13 +267,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: BuildHasher + Clone> DashMap { assert!(shard_amount.is_power_of_two()); let shift = usize::BITS as usize - ncb(shard_amount); - - if capacity != 0 { - capacity = (capacity + (shard_amount - 1)) & !(shard_amount - 1); - } - - let cps = capacity / shard_amount; - + let cps = (capacity + (shard_amount - 1)) / shard_amount; let shards = (0..shard_amount) .map(|_| CachePadded::new(RwLock::new(HashMap::with_capacity(cps)))) .collect(); From 798f9122258d99efe8cea7f188b6b104e02d3341 Mon Sep 17 00:00:00 2001 From: Alisa Sireneva Date: Sun, 28 Dec 2025 19:42:40 +0300 Subject: [PATCH 5/7] Remove unused lifetimes from bounds --- src/lib.rs | 8 +++----- src/set.rs | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index d8adf642..390705e3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -112,7 +112,7 @@ where } } -impl<'a, K: 'a + Eq + Hash, V: 'a> DashMap { +impl DashMap { /// Creates a new DashMap with a capacity of 0. /// /// # Examples @@ -1336,9 +1336,7 @@ where } } -impl<'a, K: 'a + Eq + Hash, V: 'a + PartialEq, S: BuildHasher + Clone> PartialEq - for DashMap -{ +impl PartialEq for DashMap { fn eq(&self, other: &Self) -> bool { self.len() == other.len() && self.iter().all(|r| { @@ -1349,7 +1347,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a + PartialEq, S: BuildHasher + Clone> PartialEq } } -impl<'a, K: 'a + Eq + Hash, V: 'a + Eq, S: BuildHasher + Clone> Eq for DashMap {} +impl Eq for DashMap {} impl IntoIterator for DashMap { type Item = (K, V); diff --git a/src/set.rs b/src/set.rs index 6165ed84..4ca919f8 100644 --- a/src/set.rs +++ b/src/set.rs @@ -50,7 +50,7 @@ where } } -impl<'a, K: 'a + Eq + Hash> DashSet { +impl DashSet { /// Creates a new DashSet with a capacity of 0. /// /// # Examples From 0d170a2e97246709fb3f9051b3ecd371362b8a9c Mon Sep 17 00:00:00 2001 From: Alisa Sireneva Date: Sun, 28 Dec 2025 19:43:15 +0300 Subject: [PATCH 6/7] Simplify match to ? --- src/lib.rs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 390705e3..7e4a3817 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1164,10 +1164,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> DashMap let idx = self.determine_shard(hash as usize); - let shard = match self.shards[idx].try_write() { - Some(shard) => shard, - None => return None, - }; + let shard = self.shards[idx].try_write()?; // SAFETY: The data will not outlive the guard, since we pass the guard to `Entry`. let (guard, shard) = unsafe { RwLockWriteGuardDetached::detach_from(shard) }; @@ -1227,10 +1224,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> DashMap let idx = self.determine_shard(hash as usize); - let shard = match self.shards[idx].try_write() { - Some(shard) => shard, - None => return None, - }; + let shard = self.shards[idx].try_write()?; // SAFETY: The data will not outlive the guard, since we pass the guard to `Entry`. let (guard, shard) = unsafe { RwLockWriteGuardDetached::detach_from(shard) }; From 0408162e5b1ac54bc059c649eceb6a2937efa11b Mon Sep 17 00:00:00 2001 From: Alisa Sireneva Date: Sun, 28 Dec 2025 19:44:10 +0300 Subject: [PATCH 7/7] Replace map_or with is_some_and --- src/lib.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 7e4a3817..9812987c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1333,11 +1333,9 @@ where impl PartialEq for DashMap { fn eq(&self, other: &Self) -> bool { self.len() == other.len() - && self.iter().all(|r| { - other - .get(r.key()) - .map_or(false, |ro| r.value() == ro.value()) - }) + && self + .iter() + .all(|r| other.get(r.key()).is_some_and(|ro| r.value() == ro.value())) } }