【问题标题】:Using hash functions with Bloom filters将散列函数与布隆过滤器一起使用
【发布时间】:2010-05-02 12:41:37
【问题描述】:

布隆过滤器使用散列函数(或许多)在给定输入字符串 X 的情况下生成介于 0 和 m 之间的值。我的问题是如何使用散列函数以这种方式生成值,例如 MD5散列通常由 32 长度的hex 字符串表示,我将如何使用 MD5 散列算法生成一个介于 0 和 m 之间的值,我可以在其中指定 m?我目前正在使用 Java,因此使用它提供的 MessageDigest 功能执行此操作的示例会很棒,尽管只是对如何处理它的通用描述也可以。

谢谢

【问题讨论】:

  • 通常你会为了速度而实现一个布隆过滤器或哈希表。 MD5 旨在抗碰撞和加密安全,因此与其他功能相比非常慢。您应该寻找其他要使用的函数(但无论您的散列函数如何,下面的答案都适用)

标签: hash bloom-filter


【解决方案1】:

您应该首先将哈希输出转换为无符号整数,然后以 m 为模减少它。这看起来像这样:

MessageDigest md = MessageDigest.getInstance("MD5");
// hash data...
byte[] hashValue = md.digest();
BigInteger n = new BigInteger(1, hashValue);
n = n.mod(m);
// at that point, n has a value between 0 and m-1 (inclusive)

我假设 m 是一个BigInteger 实例。如有必要,请使用BigInteger.valueOf()。同样,使用n.intValue()n.longValue() 获取n 的值作为Java 的基本类型之一。

模归约有些偏差,但如果 m 远小于 2^128,则偏差非常小。

【讨论】:

    【解决方案2】:

    最简单的方法可能是将哈希输出(作为字节序列)转换为单个二进制数并取模 m。

    【讨论】:

    • 嗨,Dav,为回复欢呼,您能否详细说明“将哈希输出(作为字节序列)转换为单个二进制数”的示例,谢谢:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2012-03-22
    • 1970-01-01
    • 2012-08-10
    • 2019-09-26
    • 2015-10-25
    相关资源
    最近更新 更多