【发布时间】:2010-10-04 10:55:29
【问题描述】:
我有一组哈希(MD5 的前 64 位,因此它们的分布非常随机),我希望能够查看一个新的哈希是否在一个集合中,并将其添加到一个集合中。
集合不要太大,最大的有几百万个元素,但是集合有几百个,我记不住。
到目前为止我的一些想法:
- 我尝试将其全部保存在 sqlite 表中,但一旦无法将所有内容都放入内存中,它就会变得非常慢。
- 布隆过滤器听起来错误率非常高。我不介意微小的错误率(64 位哈希已经在 4G 元素集上产生了 1 次冲突),但是像 1% 这样的错误率太高了。
- 在文件中保留有间隙的散列排序列表,并在我没有足够的间隙时调整大小。哈希是均匀分布的,所以即使是这样非常简单的方案也应该可以工作。
我是否遗漏了一些非常明显的东西?任何提示如何实现良好的基于磁盘的哈希表?
【问题讨论】:
-
集合中的数据是否存在某种关联?大多数数据也可以在大多数其他集合中找到,还是恰好在一个集合中?
-
如果您的未命中率非常高(即大多数查找是否定的),b-tree 或 cdb 前面的布隆过滤器仍然可以帮助您。因为您只需要磁盘查找 1% 的错误。
标签: hashtable