Skip to content

Commit 9e700fb

Browse files
committed
add hashbrown feature
1 parent 7d6227f commit 9e700fb

File tree

8 files changed

+160
-54
lines changed

8 files changed

+160
-54
lines changed

Diff for: Cargo.lock

+96
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: Cargo.toml

+5-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ keywords = ["algorithm", "lru", "lfu", "timerwheel", "slab"]
1212

1313
[dependencies]
1414
lazy_static="1.4.0"
15+
hashbrown="0.14"
1516

1617
[dev-dependencies]
1718
rand="0.8.5"
@@ -20,4 +21,7 @@ slab = "0.4.9"
2021

2122
[profile.release]
2223
opt-level = 3
23-
debug = true
24+
debug = true
25+
26+
[features]
27+
hashbrown=[]

Diff for: examples/bench_lru.rs

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use std::collections::hash_map::RandomState;
21
use std::time::Instant;
32
use algorithm::{ArcCache, LfuCache, LruCache, LruKCache};
43

@@ -65,10 +64,10 @@ fn build_high_freq_data(num: usize) -> Vec<(usize, usize)> {
6564

6665
fn do_bench(num: usize) {
6766
let evict = num * 2;
68-
let mut lru = LruCache::<usize, usize, RandomState>::new(num);
69-
let mut lruk = LruKCache::<usize, usize, RandomState>::new(num);
70-
let mut lfu = LfuCache::<usize, usize, RandomState>::new(num);
71-
let mut arc = ArcCache::<usize, usize, RandomState>::new(num / 2);
67+
let mut lru = LruCache::new(num);
68+
let mut lruk = LruKCache::new(num);
69+
let mut lfu = LfuCache::new(num);
70+
let mut arc = ArcCache::new(num / 2);
7271
println!("|名字|耗时|命中率|");
7372
println!("|---|---|---|");
7473
// let data = build_freq_data(evict);
@@ -81,5 +80,5 @@ fn do_bench(num: usize) {
8180
}
8281

8382
fn main() {
84-
do_bench(1e6 as usize);
83+
do_bench(1e5 as usize);
8584
}

Diff for: src/cache/arc.rs

+9-10
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212

1313
use std::{
1414
borrow::Borrow,
15-
collections::hash_map::RandomState,
1615
fmt::{self, Debug},
1716
hash::{BuildHasher, Hash},
1817
ops::{Index, IndexMut},
1918
};
2019

20+
use crate::DefaultHasher;
2121
use crate::{LfuCache, LruCache};
2222

2323
use super::{lfu, lru};
@@ -53,10 +53,10 @@ pub struct ArcCache<K, V, S> {
5353
cap: usize,
5454
}
5555

56-
impl<K: Hash + Eq, V> ArcCache<K, V, RandomState> {
56+
impl<K: Hash + Eq, V> ArcCache<K, V, DefaultHasher> {
5757
/// 因为存在四个数组, 所以实际的容量为这个的4倍
5858
pub fn new(cap: usize) -> Self {
59-
ArcCache::with_hasher(cap, RandomState::new())
59+
ArcCache::with_hasher(cap, DefaultHasher::default())
6060
}
6161
}
6262

@@ -715,15 +715,15 @@ impl<'a, K: Hash + Eq, V, S: BuildHasher> Iterator for ValuesMut<'a, K, V, S> {
715715
}
716716
}
717717

718-
impl<K: Hash + Eq, V> FromIterator<(K, V)> for ArcCache<K, V, RandomState> {
719-
fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> ArcCache<K, V, RandomState> {
718+
impl<K: Hash + Eq, V> FromIterator<(K, V)> for ArcCache<K, V, DefaultHasher> {
719+
fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> ArcCache<K, V, DefaultHasher> {
720720
let mut arc = ArcCache::new(2);
721721
arc.extend(iter);
722722
arc
723723
}
724724
}
725725

726-
impl<K: Hash + Eq, V> Extend<(K, V)> for ArcCache<K, V, RandomState> {
726+
impl<K: Hash + Eq, V> Extend<(K, V)> for ArcCache<K, V, DefaultHasher> {
727727
fn extend<T: IntoIterator<Item = (K, V)>>(&mut self, iter: T) {
728728
let iter = iter.into_iter();
729729
for (k, v) in iter {
@@ -797,8 +797,7 @@ unsafe impl<K: Sync, V: Sync, S: Sync> Sync for ArcCache<K, V, S> {}
797797

798798
#[cfg(test)]
799799
mod tests {
800-
use std::collections::hash_map::RandomState;
801-
800+
use crate::DefaultHasher;
802801
use super::ArcCache;
803802

804803
#[test]
@@ -853,13 +852,13 @@ mod tests {
853852

854853
#[test]
855854
fn test_empty_remove() {
856-
let mut m: ArcCache<isize, bool, RandomState> = ArcCache::new(2);
855+
let mut m: ArcCache<isize, bool, DefaultHasher> = ArcCache::new(2);
857856
assert_eq!(m.remove(&0), None);
858857
}
859858

860859
#[test]
861860
fn test_empty_iter() {
862-
let mut m: ArcCache<isize, bool, RandomState> = ArcCache::new(2);
861+
let mut m: ArcCache<isize, bool, DefaultHasher> = ArcCache::new(2);
863862
assert_eq!(m.iter().next(), None);
864863
assert_eq!(m.iter_mut().next(), None);
865864
assert_eq!(m.len(), 0);

Diff for: src/cache/lfu.rs

+9-10
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ use std::fmt::Debug;
1414
use std::ops::{Index, IndexMut};
1515
use std::{
1616
borrow::Borrow,
17-
collections::{hash_map::RandomState, HashMap, HashSet},
1817
fmt,
1918
hash::{BuildHasher, Hash},
2019
mem,
2120
ptr::NonNull,
2221
};
2322

23+
use crate::{HashMap, HashSet, DefaultHasher};
2424
use lazy_static::lazy_static;
2525

2626
use super::{KeyRef, KeyWrapper};
@@ -128,9 +128,9 @@ pub struct LfuCache<K, V, S> {
128128
reduce_count: usize,
129129
}
130130

131-
impl<K: Hash + Eq, V> LfuCache<K, V, RandomState> {
131+
impl<K: Hash + Eq, V> LfuCache<K, V, DefaultHasher> {
132132
pub fn new(cap: usize) -> Self {
133-
LfuCache::with_hasher(cap, RandomState::new())
133+
LfuCache::with_hasher(cap, DefaultHasher::default())
134134
}
135135
}
136136

@@ -1169,15 +1169,15 @@ impl<'a, K: Hash + Eq, V, S: BuildHasher> Iterator for ValuesMut<'a, K, V, S> {
11691169
}
11701170
}
11711171

1172-
impl<K: Hash + Eq, V> FromIterator<(K, V)> for LfuCache<K, V, RandomState> {
1173-
fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> LfuCache<K, V, RandomState> {
1172+
impl<K: Hash + Eq, V> FromIterator<(K, V)> for LfuCache<K, V, DefaultHasher> {
1173+
fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> LfuCache<K, V, DefaultHasher> {
11741174
let mut lru = LfuCache::new(2);
11751175
lru.extend(iter);
11761176
lru
11771177
}
11781178
}
11791179

1180-
impl<K: Hash + Eq, V> Extend<(K, V)> for LfuCache<K, V, RandomState> {
1180+
impl<K: Hash + Eq, V> Extend<(K, V)> for LfuCache<K, V, DefaultHasher> {
11811181
fn extend<T: IntoIterator<Item = (K, V)>>(&mut self, iter: T) {
11821182
let iter = iter.into_iter();
11831183
for (k, v) in iter {
@@ -1251,8 +1251,7 @@ unsafe impl<K: Sync, V: Sync, S: Sync> Sync for LfuCache<K, V, S> {}
12511251

12521252
#[cfg(test)]
12531253
mod tests {
1254-
use std::collections::hash_map::RandomState;
1255-
1254+
use crate::DefaultHasher;
12561255
use super::LfuCache;
12571256

12581257
#[test]
@@ -1299,13 +1298,13 @@ mod tests {
12991298

13001299
#[test]
13011300
fn test_empty_remove() {
1302-
let mut m: LfuCache<isize, bool, RandomState> = LfuCache::new(2);
1301+
let mut m: LfuCache<isize, bool, DefaultHasher> = LfuCache::new(2);
13031302
assert_eq!(m.remove(&0), None);
13041303
}
13051304

13061305
#[test]
13071306
fn test_empty_iter() {
1308-
let mut m: LfuCache<isize, bool, RandomState> = LfuCache::new(2);
1307+
let mut m: LfuCache<isize, bool, DefaultHasher> = LfuCache::new(2);
13091308
assert_eq!(m.iter().next(), None);
13101309
assert_eq!(m.iter_mut().next(), None);
13111310
assert_eq!(m.len(), 0);

0 commit comments

Comments
 (0)