Data structures 布卢姆过滤器的替代品

Data structures 布卢姆过滤器的替代品,data-structures,bloom-filter,Data Structures,Bloom Filter,我曾尝试使用bloom filter执行成员资格测试。我希望对800亿个条目执行成员资格测试,只允许发生大约100次碰撞,即只有100个条目可以给出假阳性结果 我知道这可以通过bloom过滤器实现,但是使用公式来确定每个条目所需的位数以及给定允许的误报率的哈希函数数。我想我最终会使用270 GB的内存和19个哈希函数 我也看了布谷鸟过滤器,但它的内存要求不符合我的要求。我的要求如下: 每个元素最多使用6位 使用的哈希函数不超过7-8个 有人能给我推荐一种除上述数据结构之外的概率数据结构来帮助我满

我曾尝试使用bloom filter执行成员资格测试。我希望对800亿个条目执行成员资格测试,只允许发生大约100次碰撞,即只有100个条目可以给出假阳性结果

我知道这可以通过bloom过滤器实现,但是使用公式来确定每个条目所需的位数以及给定允许的误报率的哈希函数数。我想我最终会使用270 GB的内存和19个哈希函数

我也看了布谷鸟过滤器,但它的内存要求不符合我的要求。我的要求如下:

  • 每个元素最多使用6位
  • 使用的哈希函数不超过7-8个

  • 有人能给我推荐一种除上述数据结构之外的概率数据结构来帮助我满足要求吗?

    散列函数数量的问题其实不是什么问题-只需选择一个具有多个输出位的散列函数,并将这些位分开,就好像它们来自不同的散列函数一样。这里真正的问题是误报率与存储空间的权衡

    你说过

    我希望对800亿个参赛作品进行会员资格测试,只需 允许发生大约100次碰撞,即只能输入100个条目 给出了假阳性结果

    根据定义,映射中的条目可以不是正。它们是正确的积极的

    接下来的问题是“100个误报占据了多少条记录?” 如果答案也是800亿,那么你要求的假阳性率大约为100/800000000=1/80000000,这小于2^-29

    任何近似成员数据结构(如Bloom filters或Buckoo filters)的最小空间为n lg 1/ε位,其中n为结构中的元素数,lg为对数基数2,ε为假阳性率。换句话说,每个元素需要超过29位才能实现像每800亿中有100位这样的误报率。每个元素6位最多只能得到1.56%的假阳性率。即每800亿人中有12.5亿人,或每6400人中有100人


    据我所知,没有已知的实际数据结构接近于实现这一点。例如,Bloom过滤器不会这样做,因为它们每项使用超过lg 1/ε位。布谷鸟过滤器不会这样做,因为它们每个项目至少使用两个额外的元数据位,并且每个项目的位速率与lg n成比例。

    您似乎不太可能找到任何数据结构来区分800亿个项目,误报率为.00000000 125,仅使用60 GB,即使您对哈希函数的数量没有限制。我没有数学来证明这一点,但在我看来,你已经超出了理论上可能的范围。好吧,如果我增加记忆力,或者我的假阳性率高达项目的1%,那么bloom filter是我的用例的一个好选择,还是有其他概率数据结构是更好的选择?我知道在我的情况下,内存需求会更多。但是,您建议使用一个散列函数并分割位是很有趣的。你有没有实现过这个,并且发现结果与使用单独的散列函数得到的结果相似?是的,我已经实现了这个,结果很好。但是,它不能用于低质量的散列族。这个空白太小,无法包含更完整的答案,但请仔细阅读vhash、universal Hash、SipHash以及类似的内容。