我在BloomFilter的上下文中有以下問題。 BloomFilters需要具有獨立的散列函數k
。我們稱這些函數爲h1, h2, ... hk
。在這種情況下獨立意味着它們的價值在應用於相同的集合時將具有非常小的相關性(希望爲零)。請參閱http://en.wikipedia.org/wiki/Bloom_filter上的算法描述(但當然,您已經知道該頁面裏面有:)。重疊的字節數組的子數組是否足以獨立地用作Bloom Filter的散列函數?
現在,假設我想使用一些n
位(來自加密函數,如果您必須知道的,但它與問題無關)來定義我的散列函數,這些位彼此獨立。如果你想要更多的上下文,你可以閱讀http://bitworking.org/news/380/bloom-filter-resources這是做類似的事情。
例如,假設我要定義每個h
爲(原諒我的僞代碼):
bytes = MD5(value)
h1 = bytes[0-3] as Integer
h2 = bytes[4-7] as Integer
h3 = bytes[8-11] as Integer
...
我們當然會用完的散列函數非常快中。在這個MD5例子中我們只得到四個。
一種可能性是讓散列函數相互重疊,並且不要求這四個字節是連續的。這樣我們有許多散列函數作爲字節數組允許的排列。爲了保持它的簡單,如果我們以下面的方式定義的哈希函數:
bytes = MD5(value)
h1 = bytes[0-3] as Integer
h2 = bytes[1-4] as Integer
h3 = bytes[2-5] as Integer
...
不難看出,在MD5情況下,我們現在有12個散列函數,而不是四個。
最後,我們得到THE的問題。這些哈希函數是獨立的嗎?謝謝!
UPDATE:我決定嘗試從實際的角度回答這個問題,所以我創建了一個小程序來測試這個假設。見下文。
感謝您的回答。我想我明白你所描述的權衡。但是,我不確定我是否理解你關於散列衝突的觀點。在我給出的例子中,字節來自MD5,但它們也可以來自Java的[Random.nextBytes](http://download.oracle.com/javase/6/docs/api/java/util/Random .html#nextBytes(byte []))函數。在這種情況下,問題將是:當我們生成一個序列字節數組「b1,b2,b3 ...」並將一個子鏈解釋爲一個整數(例如'b2 [3-7]')時,這兩個子鏈相關係數高或低? –