布隆過濾器在給定輸入字符串X的情況下使用散列函數(或多個)來生成介於0和m之間的值。我的問題是如何使用散列函數在此生成一個值例如,一個MD5散列通常用一個32長度的字符串hex
表示,我將如何使用MD5散列算法來生成一個介於0和m之間的值,我可以指定m?我現在正在使用Java,所以使用它提供的MessageDigest功能來做這件事的例子會很棒,但如何做的一般性描述也沒關係。在布隆過濾器中使用散列函數
感謝
布隆過濾器在給定輸入字符串X的情況下使用散列函數(或多個)來生成介於0和m之間的值。我的問題是如何使用散列函數在此生成一個值例如,一個MD5散列通常用一個32長度的字符串hex
表示,我將如何使用MD5散列算法來生成一個介於0和m之間的值,我可以指定m?我現在正在使用Java,所以使用它提供的MessageDigest功能來做這件事的例子會很棒,但如何做的一般性描述也沒關係。在布隆過濾器中使用散列函數
感謝
您應該首先將散列輸出轉換爲無符號整數,然後將其減少模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)
我假設米是BigInteger
實例。如有必要,請使用BigInteger.valueOf()
。同樣,使用n.intValue()
或n.longValue()
可以將n的值作爲Java的一種基本類型。
模塊化還原有些偏差,但是偏壓是非常小的,如果米基本上小於2^128。
感謝您的回答:) – dangerstat 2010-05-09 17:38:08
最簡單的方法很可能是剛剛轉換的散列輸出(作爲一個字節序列),以單一的二進制數,並採取模m。
嗨Dav,歡呼的答覆,你可以充實一個「只是將散列輸出(作爲一個字節序列)轉換爲單個二進制數「謝謝:D – dangerstat 2010-05-02 12:59:58
通常你會爲了速度而實現布隆過濾器或哈希表。 MD5的目的在於防碰撞和加密安全性,因此與其他功能相比非常慢。你應該尋找其他函數來使用(但下面的答案適用,不管你的哈希函數) – Slartibartfast 2010-08-05 03:45:50