【问题标题】:Efficient implementation of a Bloom filter in C?在 C 中有效实现布隆过滤器?
【发布时间】:2012-06-15 23:25:45
【问题描述】:

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

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

我想按比例 (1:20k) 将此数据结构用于插入和测试,因此它主要是测试密集型的。待测数据为64位整数。

【问题讨论】:

  • 这是概率性的。如果您想要确切的答案,请使用 Union Find Disjoint Set。在topcoder上搜索这个,应该有教程。
  • 如果您正在编写 C,这不是您需要通用库的那种东西。它应该少于 100 行代码,并且应该比集成第三方库花费更少的时间。只需在 Wikipedia 或类似网站上阅读您最喜欢的算法描述即可。
  • @R 编写它会花费我所知道的更少的时间,但是有效地编写它以便它可以很好地扩展是一个问题。我必须以 10^7 的顺序测试数据的成员资格,并使此查询比对 equi 连接结果的 count(*) 查询更快。在我的实施过程中,我连一毫秒都无法承受
  • 效率取决于您选择的任何散列函数(快速但碰撞概率低)和表示过滤器的效率(例如,如果您不进行计数,则为位图筛选);除此之外,没有什么可以做的优化了。
  • 你能告诉我一些我可以读到的关于适合此目的的哈希函数的地方

标签: c bloom-filter


【解决方案1】:

Chromium 在 C++ 中有一个

github link

【讨论】:

  • 伙计,他们真的需要包括 Bob Jenkins 的版权才能使用他的(公共领域)散列函数......
【解决方案2】:

不要做太多的自我推销,但我已经为Geany editor/IDE 编写了一个插件,用于过滤掉重复的文本行,它使用了一个布隆过滤器。

实现是 C 语言,你可以找到它right here on GitHub。它是 GPL v3,因此根据您的具体需求,您可能会也可能不会使用它。

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

  • 它旨在过滤字符串,并且不抽象键类型。这意味着您将不得不修改密钥处理以满足您的需求。
  • 它支持非特征语义,如果您愿意,您实际上可以将其用于完全非概率存在测试(参见bloom_filter_new() 使用的BloomContains 回调函数指针)。只需传递NULL 即可获得“纯”过滤器。
  • 字符串哈希函数是 MurmurHash2 由 Austin Appleby 编写。我评估了最新的 MurmurHash3,但版本 2 更易于使用。
  • 为了适应 Geany 生态系统,此代码始终使用 GLib 类型。

它没有针对性能进行大量调整,但应该没问题。当然,如果您在测试后得到任何反馈,我将不胜感激!

【讨论】:

  • 嘿,谢谢它确实很有帮助。我会试一试,然后告诉你。
  • 你能推荐一些其他的高性能库,而不是 glib
  • 您能否提出使用 glib 库的任何特定动机,除了它使代码可移植。
  • @AmanDeepGautam 好吧,库的标准原理当然适用:其他人已经解决了很多事情,所以我不需要重新发明轮子。另外,代码是从插件到基于 GTK+/GLib 的 IDE,所以使用 GLib 会很奇怪。
【解决方案3】:

我在这里有一个独立的纯 C 库,可能有用: https://github.com/jvirkki/libbloom

【讨论】:

    【解决方案4】:

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

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

    https://github.com/search?q=extension%3Ac+bloomfilter&type=Code&ref=searchresults

    这仅用于参考

    【讨论】:

      【解决方案5】:

      此项目中提供了几种布隆过滤器实现和替代算法:https://github.com/FastFilter/fastfilter_cpp

      涵盖了常规布隆过滤器、阻塞布隆过滤器、布谷鸟过滤器、哥伦布编码集等。它是 C++,但主要算法很容易移植到 C。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-12
        • 2011-09-22
        • 1970-01-01
        相关资源
        最近更新 更多