如何将哈希函数输出映射到布隆过滤器索引?

2024-02-28

任何人都可以帮助我提供有关哈希函数输出如何映射到布隆过滤器索引的概述吗?这是关于布隆过滤器 http://en.wikipedia.org/wiki/Bloom_filter.


关于哈希函数输出如何映射到布隆过滤器索引的概述

对于每个k在使用哈希函数时,它们映射到布隆过滤器中的一个位,就像哈希映射到哈希表中的哈希桶一样。因此,很常见的是,您可能会说生成 32 位整数的哈希函数,然后使用模数%运算符获取位索引0 << i < n where n是布隆过滤器中的位数。

为了使这一点更加具体,假设哈希函数生成从 0 到 2^32-1 的数字,并且布隆过滤器中有 1000 位:

int bit_index = hash_function(input_value) % 1000;

这里需要注意的是,2^32-1 远大于 1000。假设散列函数生成的数字相当均匀分布,但仅在 0 到 1023 之间(包含 0 和 1023),那么在模数运算之后,bit_index 的可能性会增加两倍与 24..999 相比,在 0..23 范围内(因为例如输入 2 和 1002 都会产生后模值 2,但只有输入 25 才会产生输出 25)。因此,如果您有一个生成 32 位的哈希函数,您可能需要使用大小为 2 的幂位数的布隆过滤器,然后切出哈希值的各个部分以像独立哈希函数一样使用- 所有内容都在您链接的维基百科文章中进行了解释。但这需要一个高质量的哈希函数,因为哈希函数中的任何“聚类”缺陷都将毫无保留地传递到输出;拥有素数位数是减轻这种糟糕的散列的一种方法。尽管如此,使用良好的散列函数,二的幂也可以轻松地使用按位与运算提取位索引,并且如果需要的话还可以使用位移位,这可以比整数模更快,尽管散列函数可能会使这种考虑相形见绌。整体性能概况。

编辑 - 处理评论...

假设您的 MD5 函数返回unsigned char* "p" to MD5_DIGEST_LENGTH字节数据,我建议你尝试:

BOOST_STATIC_ASSERT(MD5_DIGEST_LENGTH >= sizeof(int));
int bit_index = *reinterpret_cast<unsigned int*>(p) % num_of_bloom_filter_bits;

那实际上是一个特别糟糕的主意- 抱歉 - 我稍后会解释这两个原因。首先,回答你关于它的作用的问题:BOOST_STATIC_ASSERT()旨在如果传递的表达式计算结果为给您一个编译错误false。在这里,它基本上是记录需求的一种方式MD5_DIGEST_LENGTH- MD5 哈希文本表示的字符大小 - 至少与您的系统使用的字节数一样长int整数类型。 (该大小可能是 4 个字节,但也可能是 8 个字节。)该要求旨在确保reinterpret_cast下一行是安全的。它的作用是从 MD5 哈希文本表示开头的字节中读取一个值,就好像这些字节包含一个int。那么,说出你的int size is4,MD5哈希值是“0cc175b9c0f1b6a831c399e269772661”,如您的评论中所示:前4个字节包含“0cc1”。该文本的 ASCII 代码为十进制 48、99、99、49。当它们被读入int,根据 CPU 的字节顺序,该值可能会有所不同,但基本上您会得到其中一个数字乘以 256^3 加上另一个数字乘以 256^2 加上第三次乘以 256 加上最终数字。

我说这是一个特别糟糕的主意的原因是:

  • MD5 字符串中的每个字符要么是数字(ASCII 代码 48-57),要么是从“a”到“f”(97-102)的字母。这 16 个值只是一个字节可以具有的变化的十六分之一,而int你生成的值占用 32 位,你实际上只能得到 2^16 个不同的值。
  • 在某些计算机上,ints 必须在 2、4、8 等的倍数的内存地址处对齐。reinterpret_cast- 如果文本碰巧从不兼容的地址开始,可能会导致您的计算机崩溃。注意:Intel 和 AMD 没有此类对齐要求,尽管它们对正确对齐的数据进行操作可能会更快。

所以,另一个建议:

// create a buffer of the right size to hold a valid unsigned long in hex representation...
char data[sizeof(unsigned long) * 2 + 1];

// copy as much of the md5 text as will fit into the buffer, NUL terminating it...
sprintf(data, "%.*s", sizeof data - 1, md5);

// convert to an unsigned long...
m = strtoul(data, /*endptr*/ NULL, /*base*/ 16);

在这里,如果 md5 表示比数据缓冲区短,则只会安全地复制它的初始部分,因此不需要 BOOST_STATIC_ASSERT。

使用非加密哈希函数要容易得多,因为它们通常只会返回一个数字,而不是该数字的可读文本缓冲区表示形式,因此您可以避免所有这些废话。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将哈希函数输出映射到布隆过滤器索引? 的相关文章

  • 如何在 .NET Framework 2.0 中模拟“Func<(Of <(TResult>)>) 委托”?

    我尝试使用这个类代码项目文章 http www codeproject com KB threads AsyncVar aspx在 VB NET 和 NET Framework 2 0 中 除了这一行之外 所有内容似乎都可以编译Privat
  • 计算 Richtextbox 中所有单词的最有效方法是什么?

    我正在编写一个文本编辑器 需要提供实时字数统计 现在我正在使用这个扩展方法 public static int WordCount this string s s s TrimEnd if String IsNullOrEmpty s re
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 是否有实用的理由使用“if (0 == p)”而不是“if (!p)”?

    我倾向于使用逻辑非运算符来编写 if 语句 if p some code 我周围的一些人倾向于使用显式比较 因此代码如下所示 if FOO p some code 其中 FOO 是其中之一false FALSE 0 0 0 NULL etc
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • Azure 辅助角色“请求输入之一超出范围”的内部异常。

    我在辅助角色中调用 CloudTableClient CreateTableIfNotExist 方法 但收到一个异常 其中包含 请求输入之一超出范围 的内部异常 我做了一些研究 发现这是由于将表命名为非法表名引起的 但是 我尝试为我的表命
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • 使用 %d 打印 unsigned long long

    为什么我打印以下内容时得到 1 unsigned long long int largestIntegerInC 18446744073709551615LL printf largestIntegerInC d n largestInte
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • WebSocket安全连接自签名证书

    目标是一个与用户电脑上安装的 C 应用程序交换信息的 Web 应用程序 客户端应用程序是 websocket 服务器 浏览器是 websocket 客户端 最后 用户浏览器中的 websocket 客户端通过 Angular 持久创建 并且
  • 当我使用 OpenSSL1.1.0g 根据固定的 p 和 g 值创建 Diffie Hellman 密钥协议密钥时,应该执行哪些检查?

    您好 我尝试通过这段代码使用修复 p 和 g 参数来制作 Diffie Hellman Keysanswer https stackoverflow com a 54538811 4706711 include

随机推荐