5个版本

0.0.0-alpha2.12023年3月20日
0.0.0-alpha2.02023年3月11日
0.0.0-alpha1.02023年3月10日
0.0.0-alpha0.22023年3月9日
0.0.0-alpha0.12023年3月8日

#612 in 并发

MIT许可证

21KB
432

Seckoo

一个并发Cuckoo哈希表。

当前状态

目前Seckoo的CuckooHash仅限于单写多读设置,其中键和值都必须实现Copy,以及键的常用HashEq特质。这可能会在未来改变,以便任何实现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