Separate the query cache from the query state.
This commit is contained in:
parent
9f46259a75
commit
15b0bc6b83
9 changed files with 174 additions and 136 deletions
|
@ -63,23 +63,9 @@ impl<T> Sharded<T> {
|
|||
if SHARDS == 1 { &self.shards[0].0 } else { self.get_shard_by_hash(make_hash(val)) }
|
||||
}
|
||||
|
||||
/// Get a shard with a pre-computed hash value. If `get_shard_by_value` is
|
||||
/// ever used in combination with `get_shard_by_hash` on a single `Sharded`
|
||||
/// instance, then `hash` must be computed with `FxHasher`. Otherwise,
|
||||
/// `hash` can be computed with any hasher, so long as that hasher is used
|
||||
/// consistently for each `Sharded` instance.
|
||||
#[inline]
|
||||
pub fn get_shard_index_by_hash(&self, hash: u64) -> usize {
|
||||
let hash_len = mem::size_of::<usize>();
|
||||
// Ignore the top 7 bits as hashbrown uses these and get the next SHARD_BITS highest bits.
|
||||
// hashbrown also uses the lowest bits, so we can't use those
|
||||
let bits = (hash >> (hash_len * 8 - 7 - SHARD_BITS)) as usize;
|
||||
bits % SHARDS
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn get_shard_by_hash(&self, hash: u64) -> &Lock<T> {
|
||||
&self.shards[self.get_shard_index_by_hash(hash)].0
|
||||
&self.shards[get_shard_index_by_hash(hash)].0
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
@ -166,3 +152,17 @@ fn make_hash<K: Hash + ?Sized>(val: &K) -> u64 {
|
|||
val.hash(&mut state);
|
||||
state.finish()
|
||||
}
|
||||
|
||||
/// Get a shard with a pre-computed hash value. If `get_shard_by_value` is
|
||||
/// ever used in combination with `get_shard_by_hash` on a single `Sharded`
|
||||
/// instance, then `hash` must be computed with `FxHasher`. Otherwise,
|
||||
/// `hash` can be computed with any hasher, so long as that hasher is used
|
||||
/// consistently for each `Sharded` instance.
|
||||
#[inline]
|
||||
pub fn get_shard_index_by_hash(hash: u64) -> usize {
|
||||
let hash_len = mem::size_of::<usize>();
|
||||
// Ignore the top 7 bits as hashbrown uses these and get the next SHARD_BITS highest bits.
|
||||
// hashbrown also uses the lowest bits, so we can't use those
|
||||
let bits = (hash >> (hash_len * 8 - 7 - SHARD_BITS)) as usize;
|
||||
bits % SHARDS
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue