Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中Bloom过滤器的高效实现?_C_Bloom Filter - Fatal编程技术网

C语言中Bloom过滤器的高效实现?

C语言中Bloom过滤器的高效实现?,c,bloom-filter,C,Bloom Filter,这个问题以前有人问过,但当时没有答案,所以我决定再问一次 我需要用C(而不是C++)高效地实现Bloom过滤器。如果没有这样的东西可用,我不介意实现一个,如果给它一些好的参考,这样它就不会占用我太多的时间 我希望以一个比率(1:20k)将此数据结构用于插入和测试,因此它主要是测试密集型的。要测试的数据是64位整数。Chromium在C中有一个整数++ 为了不做太多的自我宣传,我已经为该网站编写了一个插件,它使用Bloom过滤器过滤掉重复的文本行 实现是C语言的,您可以找到它。它是GPLv3,所以

这个问题以前有人问过,但当时没有答案,所以我决定再问一次

我需要用C(而不是C++)高效地实现Bloom过滤器。如果没有这样的东西可用,我不介意实现一个,如果给它一些好的参考,这样它就不会占用我太多的时间


我希望以一个比率(1:20k)将此数据结构用于插入和测试,因此它主要是测试密集型的。要测试的数据是64位整数。

Chromium在C中有一个整数++


为了不做太多的自我宣传,我已经为该网站编写了一个插件,它使用Bloom过滤器过滤掉重复的文本行

实现是C语言的,您可以找到它。它是GPLv3,所以根据您的具体需要,您可能会使用它,也可能不会使用它

关于我的实现的一些注意事项:

  • 它的设计目的是过滤字符串,而不是抽象密钥类型。这意味着您必须修改密钥处理以满足您的需要
  • 它支持非特征语义,如果您愿意,您实际上可以将其用于完全非概率的存在性测试(请参阅
    BloomContains
    bloomfilter\u new()使用的回调函数指针)。只需传递
    NULL
    即可获得“纯”过滤器
  • 字符串哈希函数由Austin Appleby编写。我评估了当前版本3,但版本2更容易使用
  • 为了适应Geany生态系统,此代码始终使用类型

它的性能还没有经过严格的调整,但应该可以。当然,如果您在测试后有任何反馈,我将不胜感激

我这里有一个独立的纯C库,它可能有用:

我知道这是一个老问题,但这里有一些github搜索结果供参考

在github上简单搜索“bloomfilter”会产生大量结果(对于C):


这仅供参考。

本项目中提供了几种布卢姆过滤器实现和替代算法:


包括常规布卢姆过滤器、阻塞布卢姆过滤器、布谷鸟过滤器、Golomb编码集等。它是C++,但主要算法易于移植到C.</P>,具有概率性。如果您想要精确的答案,请使用并集查找不相交集。在topcoder上搜索这个,应该有一些教程。如果你在写C,这不是你需要一个通用库来完成的事情。它应该少于100行代码,并且应该比集成第三方库花费更少的时间来编写。只要在Wikipedia或类似网站上阅读您最喜欢的算法描述。@R编写它所需的时间比我知道的要少,但高效地编写它以使其能够很好地扩展是一个问题。我必须以10^7的顺序测试数据的成员资格,并使此查询比对等联接结果的count(*)查询更快。在我的实现中,我甚至不能失去一个ms。效率取决于您选择的任何哈希函数(速度快但冲突概率低),以及表示过滤器的效率(例如,如果您没有进行计数过滤器,则为位图);除此之外,没有更多的优化可以做。你能告诉我一些地方我可以读到适合这个目的的散列函数吗?他们真的需要包括Bob Jenkins的版权,因为他们使用了他的(公共领域)散列函数…嘿,谢谢,这确实非常有用。我会尝试一下,然后告诉你。你能推荐一些除glibcan之外的其他高性能库吗?你能推荐使用glib库的任何特定动机,除了它使代码可移植之外。@AmanDeepGautam当然,库的标准原理适用于:其他人已经解决了很多问题,所以我不需要重新发明轮子。另外,代码是从插件到基于GTK+/GLib的IDE的,所以不使用GLib会很奇怪。