Skip to content

Commit 2dbe9f7

Browse files
author
Jan-Willem Maessen
committed
Version used for blog post
1 parent a45a0b8 commit 2dbe9f7

File tree

3 files changed

+4126
-10
lines changed

3 files changed

+4126
-10
lines changed

src/hash_set.rs

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ pub struct HashSet {
2727
pub set_order: Vec<Key>,
2828
next_clean_size: usize,
2929
curr_x: usize,
30+
prev_x2: usize,
3031
}
3132

3233
pub fn bucket(k: Key) -> usize {
@@ -66,6 +67,7 @@ impl HashSet {
6667
set_order: Vec::with_capacity(N + 1),
6768
next_clean_size: N / 4,
6869
curr_x: 1,
70+
prev_x2: N + 1,
6971
}
7072
}
7173

@@ -89,7 +91,7 @@ impl HashSet {
8991
}
9092
Entry::Full(bk, k) => {
9193
self.set[i] = Entry::Full(bn, n);
92-
self.register_remove(k, b);
94+
self.register_remove(bk, k, b);
9395
self.register_insert(bn, n, b);
9496
n = k;
9597
bn = bk;
@@ -111,6 +113,12 @@ impl HashSet {
111113
let bn = bucket(n);
112114
let b = self.insert_loop(bn, n, b);
113115
if self.bkk && self.size == self.next_clean_size {
116+
let prev_nx2 = N / self.prev_x2;
117+
for ii in 1..prev_nx2 {
118+
let i = ii * self.prev_x2;
119+
let k = (i << RSHIFT) - 1;
120+
self.remove_tombstone(k);
121+
}
114122
self.curr_x = N / (N - self.size());
115123
let x4 = 4 * self.curr_x;
116124
let x2 = 2 * self.curr_x;
@@ -121,6 +129,7 @@ impl HashSet {
121129
self.insert_tombstone(k);
122130
}
123131
self.next_clean_size += N / x4;
132+
self.prev_x2 = x2;
124133
}
125134
self.register_insert_len(b - 1, bn);
126135
}
@@ -134,7 +143,12 @@ impl HashSet {
134143
loop {
135144
let i1 = (i + 1) & (N - 1);
136145
match self.set[i1] {
137-
Entry::Full(bk, _) | Entry::Tombstone(bk, _) if bk != i1 => {
146+
Entry::Full(bk, k) if bk != i1 => {
147+
self.register_remove(bk, k, i1);
148+
self.set[i] = self.set[i1];
149+
self.register_insert(bk, k, i);
150+
}
151+
Entry::Tombstone(bk, _) if bk != i1 => {
138152
self.set[i] = self.set[i1];
139153
}
140154
_ => {
@@ -154,7 +168,7 @@ impl HashSet {
154168
Entry::Empty => { }
155169
Entry::Full(_, k) if k == n => { }
156170
Entry::Full(bk, k) => {
157-
self.register_remove(k, b);
171+
self.register_remove(bk, k, b);
158172
self.set[i] = Entry::Tombstone(bn, n);
159173
self.insert_loop(bk, k, b + 1);
160174
}
@@ -164,8 +178,7 @@ impl HashSet {
164178
}
165179
}
166180

167-
fn register_remove(&mut self, k: Key, b: usize) {
168-
let bk = bucket(k);
181+
fn register_remove(&mut self, bk: usize, _: Key, b: usize) {
169182
let mut d = if bk > b { b + N - bk } else { b - bk };
170183
if d >= N {
171184
d -= N;

src/main.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use bkk_hash::hash_set::{bucket, HashSet, Key, ProbeHist, N};
22
use rand::random;
33

4+
const TRIALS: usize = 10000;
5+
46
fn dump_hists(desc: &str, hists: Vec<ProbeHist>) {
57
for (i, h) in hists.into_iter().enumerate() {
68
let x = N as f64 / (N - i) as f64;
@@ -39,7 +41,7 @@ fn agg_to_hists(hists: &mut Vec<ProbeHist>, new_hists: Vec<ProbeHist>) {
3941
fn do_one(bkk: bool) {
4042
let mut agg_probe_hists = vec![ProbeHist::default(); N];
4143
let mut agg_insert_hists = vec![ProbeHist::default(); N];
42-
for trial in 0..1000 {
44+
for trial in 0..TRIALS {
4345
let mut set = HashSet::new(bkk);
4446
while set.size() < N {
4547
let i: Key = random();
@@ -80,7 +82,7 @@ fn do_one(bkk: bool) {
8082
);
8183
assert_eq!(set.size(), set.insert_lens.len());
8284
}
83-
if true {
85+
if false {
8486
println!(
8587
"{:3},\t{:.3}",
8688
trial,
@@ -98,9 +100,10 @@ fn do_one(bkk: bool) {
98100
*agg_insert_hists[i].entry(l).or_insert(0) += 1;
99101
}
100102
}
101-
println!("what, i, x,\tmean,\tstddev,\tmean/x,\tstddev/x");
102-
dump_hists("pr", agg_probe_hists);
103-
dump_hists("in", agg_insert_hists);
103+
println!("test, op, i, x,\tmean,\tstddev,\tmean/x,\tstddev/x");
104+
let bkk_str = if bkk { "bkk" } else { "std" };
105+
dump_hists(&format!("{}, probe_len", bkk_str), agg_probe_hists);
106+
dump_hists(&format!("{}, insert_len", bkk_str), agg_insert_hists);
104107
}
105108

106109
fn main() {

0 commit comments

Comments
 (0)