麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 邏輯算法 > 正文

PHP中實現(xiàn)Bloom Filter算法

2020-03-22 17:04:04
字體:
供稿:網(wǎng)友
介紹下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ù)器。 布隆過濾器是由巴頓.布隆于一九七零年提出的。它實際上是一個很長的二進(jìn)制向量和一系列隨機映射函數(shù)。我們通過上面的例子來說明起工作原理。 假定我們存儲一億個電子郵件地址,我們先建立一個十六億二進(jìn)制(比特),即兩億字節(jié)的向量,然后將這十六億個二進(jìn)制位全部設(shè)置為零。對于每一個電子郵件地址 X,我們用八個不同的隨機數(shù)產(chǎn)生器(F1,F2, ...,F8) 產(chǎn)生八個信息指紋(f1, f2, ..., f8)。再用一個隨機數(shù)產(chǎn)生器 G 把這八個信息指紋映射到 1 到十六億中的八個自然數(shù) g1, g2, ...,g8。現(xiàn)在我們把這八個位置的二進(jìn)制位全部設(shè)置為一。當(dāng)我們對這一億個 email 地址都進(jìn)行這樣的處理后。一個針對這些 email 地址的布隆過濾器就建成了。(見下圖) 現(xiàn)在,讓我們看看如何用布隆過濾器來檢測一個可疑的電子郵件地址 Y 是否在黑名單中。我們用相同的八個隨機數(shù)產(chǎn)生器(F1, F2, ..., F8)對這個地址產(chǎn)生八個信息指紋 s1,s2,...,s8,然后將這八個指紋對應(yīng)到布隆過濾器的八個二進(jìn)制位,分別是 t1,t2,...,t8。如果 Y 在黑名單中,顯然,t1,t2,..,t8 對應(yīng)的八個二進(jìn)制一定是一。這樣在遇到任何在黑名單中的電子郵件地址,我們都能準(zhǔn)確地發(fā)現(xiàn)。 布隆過濾器決不會漏掉任何一個在黑名單中的可疑地址。但是,它有一條不足之處。也就是它有極小的可能將一個不在黑名單中的電子郵件地址判定為在黑名單中,因為有可能某個好的郵件地址正巧對應(yīng)八個都被設(shè)置成一的二進(jìn)制位。好在這種可能性很小。我們把它稱為誤識概率。在上面的例子中,誤識概率在萬分之一以下。 布隆過濾器的好處在于快速,省空間。但是有一定的誤識別率。常見的補救辦法是在建立一個小的白名單,存儲那些可能別誤判的郵件地址。
// 通過某種算法改變$bloomFiter 中位數(shù)組表示集合,這里我們使用簡單的算法,把集合中對應(yīng)的html' target='_blank'>value 對應(yīng)到bloom中的位置變成1 // 算法如下
// 上面只是一個簡單的例子,實際上哈希算法需要好幾個,但另一方面,如果哈希函數(shù)的個數(shù)少,那么位數(shù)組中的0就多
function __construct($hash_func_num=1, $space_group_num=1) { $max_length = pow(2, 25); $binary = pack('C', 0); //1字節(jié)占用8位 $this- one_num = 8; //默認(rèn)32m*1 $this- space_group_num = $space_group_num; $this- hash_space_assoc = array(); //分配空間 for($i=0; $i $this- space_group_num; $i++){ $this- hash_space_assoc[$i] = str_repeat($binary, $max_length); $this- pow_array = array( 0 = 1, 1 = 2, 2 = 4, 3 = 8, 4 = 16, 5 = 32, 6 = 64, 7 = 128, $this- chr_array = array(); $this- ord_array = array(); for($i=0; $i $i++){ $chr = chr($i); $this- chr_array[$i] = $chr; $this- ord_array[$chr] = $i; $this- hash_func_pos = array( 0 = array(0, 7, 1), 1 = array(7, 7, 1), 2 = array(14, 7, 1), 3 = array(21, 7, 1), 4 = array(28, 7, 1), 5 = array(33, 7, 1), 6 = array(17, 7, 1), $this- write_num = 0; $this- ext_num = 0; if(!$hash_func_num){ $this- hash_func_num = count($this- hash_func_pos); else{ $this- hash_func_num = $hash_func_num; function add($key) { $hash_bit_set_num = 0;// 離散key $hash_basic = sha1($key);// 截取前4位,然后十六進(jìn)制轉(zhuǎn)換為十進(jìn)制 $hash_space = hexdec(substr($hash_basic, 0, 4));// 取模 $hash_space = $hash_space % $this- space_group_num; for($hash_i=0; $hash_i $this- hash_func_num; $hash_i++){ $hash = hexdec(substr($hash_basic, $this- hash_func_pos[$hash_i][0], $this- hash_func_pos[$hash_i][1])); $bit_pos = $hash 3; $max = $this- ord_array[$this- hash_space_assoc[$hash_space][$bit_pos]]; $num = $hash - $bit_pos * $this- one_num; $bit_pos_value = ($max $num) if(!$bit_pos_value){ $max = $max | $this- pow_array[$num]; $this- hash_space_assoc[$hash_space][$bit_pos] = $this- chr_array[$max]; $this- write_num++; else{ $hash_bit_set_num++; if($hash_bit_set_num == $this- hash_func_num){ $this- ext_num++; return true; return false; function get_stat() { return array( 'ext_num' = $this- ext_num, 'write_num' = $this- write_num,
//分配1個存儲空間,每個空間為32M,理論上是空間越大誤判率越低,注意php.ini中可使用的內(nèi)存限制$space_group_num = 1;$bf = new bloom_filter($hash_func_num, $space_group_num);$list = array( 'http://test/1', 'http://test/2', 'http://test/3', 'http://test/4', 'http://test/5', 'http://test/6', 'http://test/1', 'http://test/2',foreach($list as $k = $v){ if($bf- add($v)){ echo $v, "/n";print_r($bf- get_stat());PHP教程

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 免费一级a毛片免费观看 | 黄色大片大毛片 | 久久精品免费网站 | 美女91视频| 欧美精品欧美 | 国产成人自拍视频在线 | 久艹在线视频 | 蜜桃传媒视频麻豆第一区免费观看 | 成人超碰 | 日本成人二区 | 精品国产91久久久久久久 | 成人综合在线观看 | 深夜视频福利 | 国产免费一区二区三区 | 日韩不卡一区二区 | 草b视频在线观看 | hd欧美free性xxxx护土 | 亚洲精品一区二区三区在线看 | 黄色a级片视频 | 蜜桃传媒视频麻豆第一区免费观看 | 人人做人人看 | 99精品视频在线免费观看 | 国产毛片网 | 久久精品欧美一区二区 | 国产在线精品一区二区三区 | 成人激情综合网 | 久久久视频免费观看 | 毛片视频在线免费观看 | 久久久新 | 欧美激情区 | 日本黄色免费片 | 龙的两根好大拔不出去h | 久久精品亚洲精品国产欧美kt∨ | 久久久久北条麻妃免费看 | 久久精品亚洲精品国产欧美kt∨ | 国产一区国产二区在线观看 | 久久精品久 | 欧美hdfree性xxxx | 一夜新娘第三季免费观看 | 免费a级毛片永久免费 | qyl在线视频精品免费观看 |