5个版本
0.0.0-alpha2.1 | 2023年3月20日 |
---|---|
0.0.0-alpha2.0 | 2023年3月11日 |
0.0.0-alpha1.0 | 2023年3月10日 |
0.0.0-alpha0.2 | 2023年3月9日 |
0.0.0-alpha0.1 | 2023年3月8日 |
#612 in 并发
21KB
432 行
Seckoo
一个并发Cuckoo哈希表。
当前状态
目前Seckoo的CuckooHash
仅限于单写多读设置,其中键和值都必须实现Copy
,以及键的常用Hash
和Eq
特质。这可能会在未来改变,以便任何实现Hash + Eq
的键都可以使用。
Seckoo也是一个固定容量的哈希表,但这也可能在未来版本中改变。
因此,这个crate及其API仍然非常不稳定,应谨慎使用!
待办事项
- 关键
-
insert
当前允许表中有多个相等的键同时存在。修复这个问题!- 它实际上是这样吗?如果我们搜索一个键,空桶应该意味着它不在列表中,因为键应该总是尽早尝试插入。一旦我们允许删除元素,那么这将成为一个关注点!
- 将桶组项更改为
*mut Bucket<K, V>
将减少最小分配大小,因为桶数组/Vec
将更小。
-
- 从SeqLock升级到指针设置。
- 将
Bucket<K, V>
更改为AtomicPointer<Bucket<K, V>>
- 添加垃圾收集 (
crossbeam_epoch::Epoch
)。 -
添加Entry<'c, K, V, ...>
类型,以提供对键的并发访问。 - 删除
WriteGuard<'c, K, V, ...>
,因为它可能不再需要
- 将
- 添加其他方法(在伪Rust中)
-
len(&self) -> usize
-
get_or_insert(&self,键:K,f: impl FnOnce() -> V) -> 条目<'c,K,V,...>;
-
这现在是默认行为。get_cloned(&self, key: &K) -> Option<V> where V: Clone;
-
包含(&self,键: &K) -> bool;
-
- 插入/删除方案
- 当达到最大容量时,我们如何处理插入操作?
- 选项 (1):有一个递归深度计数器,最终只是插入新项目,而不尝试重新插入旧项目。
- 选项 (2):我们在数组填满后阻止插入,留出一定比例的空间。
- 当达到最大容量时,我们如何处理插入操作?
- 散列/需要多少Hasher?
- 我们应该有多少hasher?
- 选项 (1):使用
const
泛型来给用户选择的能力。 - 选项 (2):使用一个固定数量,比如2个?
- 如果我们利用这个特性,我们可以为第一个索引使用一个
Hasher
,并为第二个索引创建一个标签。然后我们可以标记我们的指针以简化比较,并使用与第一个哈希值进行XOR操作的标签来获取第二个索引。
- 如果我们利用这个特性,我们可以为第一个索引使用一个
- 提高代码覆盖率
- 添加模糊测试
- 添加基准测试
依赖项
~255KB