布隆过滤器使用散列函数(或许多)在给定输入字符串X的情况下生成介于0和m之间的值。我的问题是如何使用散列函数以这种方式生成值,例如MD5 hash通常由32个长度hex
字符串表示,我如何使用MD5哈希算法生成0到m之间的值,我可以指定m?我现在正在使用Java,所以使用它提供的MessageDigest功能这样做的例子会很棒,尽管只是对如何处理它的一般描述也会很好。
由于
答案 0 :(得分:4)
您应首先将哈希输出转换为无符号整数,然后将其模数 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 ,偏差非常小。
答案 1 :(得分:0)
最简单的方法可能是将哈希输出(作为字节序列)转换为单个二进制数并取模数。