Bloom Filter的基本處理思路:
申請一批空間用于保存0 1信息,再根據(jù)一批哈希函數(shù)確定元素對應(yīng)的位置巧鸭,如果每個哈希函數(shù)對應(yīng)位置的值為全部1,說明此元素存在辐啄。相反,如果為0,則要把對應(yīng)位置的值設(shè)置為1饼问。由于不同的元素可能會有相同的哈希值养筒,即同一個位置有可能保存了多個元素的信息郑叠,從而導(dǎo)致存在一定的誤判率裆装。
如果申請空間太小,隨著元素的增多潦闲,1會越來越多攒菠,各個元素沖突的機會越來越來大,導(dǎo)致誤判率會越來越大歉闰。另外哈希函數(shù)的選擇及個數(shù)上也要平衡好辖众,多個哈希函數(shù)雖然可以提供判斷的準(zhǔn)確性,但是會降低程序的處理速度新娜,而哈希函數(shù)的增加又要求有更多的空間來存儲位置信息赵辕。
Bloom-Filter的應(yīng)用。
Bloom-Filter一般用于在大數(shù)據(jù)量的集合中判定某元素是否存在概龄。例如郵件服務(wù)器中的垃圾郵件過濾器还惠。在搜索引擎領(lǐng)域,Bloom-Filter最常用于網(wǎng)絡(luò)蜘蛛(Spider)的URL過濾私杜,網(wǎng)絡(luò)蜘蛛通常有一個 URL列表蚕键,保存著將要下載和已經(jīng)下載的網(wǎng)頁的URL救欧,網(wǎng)絡(luò)蜘蛛下載了一個網(wǎng)頁,從網(wǎng)頁中提取到新的URL后锣光,需要判斷該URL是否已經(jīng)存在于列表中笆怠。此時,Bloom-Filter算法是最好的選擇誊爹。
比如說蹬刷,一個象 Yahoo,Hotmail 和 Gmai 那樣的公眾電子郵件(email)提供商,總是需要過濾來自發(fā)送垃圾郵件的人(spamer)的垃圾郵件频丘。一個辦法就是記錄下那些發(fā)垃圾郵件的 email 地址办成。由于那些發(fā)送者不停地在注冊新的地址,全世界少說也有幾十億個發(fā)垃圾郵件的地址搂漠,將他們都存起來則需要大量的網(wǎng)絡(luò)服務(wù)器迂卢。
布隆過濾器是由巴頓.布隆于一九七零年提出的。它實際上是一個很長的二進制向量和一系列隨機映射函數(shù)桐汤。我們通過上面的例子來說明起工作原理而克。
假定我們存儲一億個電子郵件地址,我們先建立一個十六億二進制(比特)怔毛,即兩億字節(jié)的向量员萍,然后將這十六億個二進制位全部設(shè)置為零。對于每一個電子郵件地址 X馆截,我們用八個不同的隨機數(shù)產(chǎn)生器(F1,F2, ...,F8) 產(chǎn)生八個信息指紋(f1, f2, ..., f8)充活。再用一個隨機數(shù)產(chǎn)生器 G 把這八個信息指紋映射到 1 到十六億中的八個自然數(shù) g1, g2, ...,g8》淅颍現(xiàn)在我們把這八個位置的二進制位全部設(shè)置為一蜡娶。當(dāng)我們對這一億個 email 地址都進行這樣的處理后。一個針對這些 email 地址的布隆過濾器就建成了映穗。(見下圖) 現(xiàn)在窖张,讓我們看看如何用布隆過濾器來檢測一個可疑的電子郵件地址 Y 是否在黑名單中。我們用相同的八個隨機數(shù)產(chǎn)生器(F1, F2, ..., F8)對這個地址產(chǎn)生八個信息指紋 s1,s2,...,s8蚁滋,然后將這八個指紋對應(yīng)到布隆過濾器的八個二進制位宿接,分別是 t1,t2,...,t8。如果 Y 在黑名單中辕录,顯然睦霎,t1,t2,..,t8 對應(yīng)的八個二進制一定是一。這樣在遇到任何在黑名單中的電子郵件地址走诞,我們都能準(zhǔn)確地發(fā)現(xiàn)副女。
布隆過濾器決不會漏掉任何一個在黑名單中的可疑地址。但是蚣旱,它有一條不足之處碑幅。也就是它有極小的可能將一個不在黑名單中的電子郵件地址判定為在黑名單中戴陡,因為有可能某個好的郵件地址正巧對應(yīng)八個都被設(shè)置成一的二進制位。好在這種可能性很小沟涨。我們把它稱為誤識概率恤批。在上面的例子中,誤識概率在萬分之一以下裹赴。
布隆過濾器的好處在于快速喜庞,省空間。但是有一定的誤識別率棋返。常見的補救辦法是在建立一個小的白名單赋荆,存儲那些可能別誤判的郵件地址。
簡單實現(xiàn)
$set = array(1,2,3,4,5,6);
$bloomFiter = array(0,0,0,0,0,0,0,0,0,0);
foreach($set as $key){
$bloomFiter[$key] = 1 ;
}
//判斷是否在集合中
if($bloomFiter[9] ==1){
echo '在set 中';
}else{
echo '不在set 中' ;
}
其他完整實現(xiàn)
請參考以下文獻列表
1懊昨、PHP中實現(xiàn)Bloom Filter算法
2窄潭、php實現(xiàn)Bloom Filter
3、php-bloom
4酵颁、url去重 --布隆過濾器 bloom filter原理及python實現(xiàn)