1
- use std:: collections:: HashSet ;
2
- use std:: hash:: BuildHasher ;
3
- use std:: hash:: Hash ;
4
- use std:: hash:: Hasher ;
5
- use std:: sync:: Arc ;
6
-
7
- use crate :: xor8:: filter:: fingerprint;
8
- use crate :: xor8:: filter:: splitmix64;
9
- use crate :: xor8:: filter:: XorSet ;
10
- use crate :: xor8:: Xor8 ;
11
- use crate :: BuildHasherDefault ;
1
+ use std:: {
2
+ collections:: HashSet ,
3
+ hash:: { BuildHasher , Hash , Hasher } ,
4
+ sync:: Arc ,
5
+ } ;
6
+
7
+ use crate :: {
8
+ xor8:: {
9
+ filter:: { fingerprint, splitmix64, XorSet } ,
10
+ Xor8 ,
11
+ } ,
12
+ BuildHasherDefault ,
13
+ } ;
12
14
13
15
#[ derive( Clone , Copy , Default ) ]
14
16
struct KeyIndex {
87
89
88
90
/// Insert 64-bit digest of a single key.
89
91
///
90
- /// Digest for the key shall be generated using the default-hasher or via hasher
91
- /// supplied via [Xor8Builder::with_hasher] method.
92
+ /// Digest for the key shall be generated using the default-hasher or via
93
+ /// hasher supplied via [Xor8Builder::with_hasher] method.
92
94
pub fn insert < K : ?Sized + Hash > ( & mut self , key : & K ) {
93
95
let digest = self . hash ( key) ;
94
96
98
100
99
101
/// Populate with 64-bit digests for a collection of keys of type `K`.
100
102
///
101
- /// Digest for key shall be generated using the default-hasher or via hasher supplied
102
- /// via [Xor8Builder::with_hasher] method.
103
+ /// Digest for key shall be generated using the default-hasher or via hasher
104
+ /// supplied via [Xor8Builder::with_hasher] method.
103
105
pub fn populate < ' i , K : Hash + ' i , I : IntoIterator < Item = & ' i K > > ( & mut self , keys : I ) {
104
106
let mut n = 0 ;
105
107
@@ -125,40 +127,44 @@ where
125
127
self . num_digests += n;
126
128
}
127
129
128
- /// Build bitmap for keys that where previously inserted using [Xor8Builder::insert],
129
- /// [Xor8Builder::populate] and [Xor8Builder::populate_digests] method.
130
+ /// Build bitmap for keys that where previously inserted using
131
+ /// [Xor8Builder::insert], [Xor8Builder::populate] and
132
+ /// [Xor8Builder::populate_digests] method.
130
133
pub fn build ( & mut self ) -> Result < Xor8 < H > , crate :: Error > {
131
134
let digest_len = self . digests . len ( ) ;
132
- let digests = self . digests . iter ( ) . copied ( ) ;
133
- Self :: build_inner ( self . hash_builder . clone ( ) , || digests. clone ( ) , digest_len)
135
+ Self :: build_inner (
136
+ self . hash_builder . clone ( ) ,
137
+ self . digests . iter ( ) . copied ( ) ,
138
+ digest_len,
139
+ )
134
140
}
135
141
136
142
/// Build a bitmap for pre-computed 64-bit digests for keys.
137
143
///
138
144
/// If keys where previously inserted using [Xor8Builder::insert] or
139
- /// [Xor8Builder::populate] or [Xor8Builder::populate_digests] methods, they shall be
140
- /// ignored.
145
+ /// [Xor8Builder::populate] or [Xor8Builder::populate_digests] methods, they
146
+ /// shall be ignored.
141
147
///
142
- /// It is upto the caller to ensure that digests are unique, that there no duplicates.
148
+ /// It is upto the caller to ensure that digests are unique, that there no
149
+ /// duplicates.
143
150
pub fn build_from_digests (
144
151
& mut self ,
145
152
digests : & [ u64 ] ,
146
153
) -> Result < Xor8 < H > , crate :: Error > {
147
154
Self :: build_inner (
148
155
self . hash_builder . clone ( ) ,
149
- || digests. iter ( ) . copied ( ) ,
156
+ digests. iter ( ) . copied ( ) ,
150
157
digests. len ( ) ,
151
158
)
152
159
}
153
160
154
- fn build_inner < F , It > (
161
+ fn build_inner < It > (
155
162
hash_builder : H ,
156
- digest_generator : F ,
163
+ digest_iter : It ,
157
164
digest_len : usize ,
158
165
) -> Result < Xor8 < H > , crate :: Error >
159
166
where
160
- F : Fn ( ) -> It ,
161
- It : IntoIterator < Item = u64 > + Clone ,
167
+ It : Iterator < Item = u64 > + Clone ,
162
168
{
163
169
let mut ff = Xor8 :: < H > :: new ( hash_builder) ;
164
170
@@ -182,7 +188,7 @@ where
182
188
let mut sets2: Vec < XorSet > = vec ! [ XorSet :: default ( ) ; block_length] ;
183
189
184
190
loop {
185
- for key in digest_generator ( ) {
191
+ for key in digest_iter . clone ( ) {
186
192
let hs = ff. get_h0h1h2 ( key) ;
187
193
sets0[ hs. h0 as usize ] . xor_mask ^= hs. h ;
188
194
sets0[ hs. h0 as usize ] . count += 1 ;
0 commit comments