亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

PHP中實現Bloom Filter算法

2024-05-04 23:33:34
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了PHP中實現Bloom Filter算法,本文直接給出實現代碼,代碼中給出詳細注釋,Bloom Filter算法介紹等內容,需要的朋友可以參考下

 

  1. <?php 
  2.  
  3. /*Bloom Filter算法來去重過濾。 
  4.  
  5.  
  6. 介紹下Bloom Filter的基本處理思路:申請一批空間用于保存0 1信息,再根據一批哈希函數確定元素對應的位置,如果每個哈希函數對應位置的值為全部1,說明此元素存在。相反,如果為0,則要把對應位置的值設置為1。由于不同的元素可能會有相同的哈希值,即同一個位置有可能保存了多個元素的信息,從而導致存在一定的誤判率。 
  7.  
  8. 如果申請空間太小,隨著元素的增多,1會越來越多,各個元素沖突的機會越來越來大,導致誤判率會越來越大。另外哈希函數的選擇及個數上也要平衡好,多個哈希函數雖然可以提供判斷的準確性,但是會降低程序的處理速度,而哈希函數的增加又要求有更多的空間來存儲位置信息。 
  9.  
  10. Bloom-Filter的應用。 
  11. Bloom-Filter一般用于在大數據量的集合中判定某元素是否存在。例如郵件服務器中的垃圾郵件過濾器。在搜索引擎領域,Bloom-Filter最常用于網絡蜘蛛(Spider)的URL過濾,網絡蜘蛛通常有一個 URL列表,保存著將要下載和已經下載的網頁的URL,網絡蜘蛛下載了一個網頁,從網頁中提取到新的URL后,需要判斷該URL是否已經存在于列表中。此時,Bloom-Filter算法是最好的選擇。  
  12. 比如說,一個象 Yahoo,Hotmail 和 Gmai 那樣的公眾電子郵件(email)提供商,總是需要過濾來自發送垃圾郵件的人(spamer)的垃圾郵件。一個辦法就是記錄下那些發垃圾郵件的 email 地址。由于那些發送者不停地在注冊新的地址,全世界少說也有幾十億個發垃圾郵件的地址,將他們都存起來則需要大量的網絡服務器。  
  13.  
  14. 布隆過濾器是由巴頓.布隆于一九七零年提出的。它實際上是一個很長的二進制向量和一系列隨機映射函數。我們通過上面的例子來說明起工作原理。 
  15.  
  16. 假定我們存儲一億個電子郵件地址,我們先建立一個十六億二進制(比特),即兩億字節的向量,然后將這十六億個二進制位全部設置為零。對于每一個電子郵件地址 X,我們用八個不同的隨機數產生器(F1,F2, ...,F8) 產生八個信息指紋(f1, f2, ..., f8)。再用一個隨機數產生器 G 把這八個信息指紋映射到 1 到十六億中的八個自然數 g1, g2, ...,g8?,F在我們把這八個位置的二進制位全部設置為一。當我們對這一億個 email 地址都進行這樣的處理后。一個針對這些 email 地址的布隆過濾器就建成了。(見下圖) 現在,讓我們看看如何用布隆過濾器來檢測一個可疑的電子郵件地址 Y 是否在黑名單中。我們用相同的八個隨機數產生器(F1, F2, ..., F8)對這個地址產生八個信息指紋 s1,s2,...,s8,然后將這八個指紋對應到布隆過濾器的八個二進制位,分別是 t1,t2,...,t8。如果 Y 在黑名單中,顯然,t1,t2,..,t8 對應的八個二進制一定是一。這樣在遇到任何在黑名單中的電子郵件地址,我們都能準確地發現。  
  17. 布隆過濾器決不會漏掉任何一個在黑名單中的可疑地址。但是,它有一條不足之處。也就是它有極小的可能將一個不在黑名單中的電子郵件地址判定為在黑名單中,因為有可能某個好的郵件地址正巧對應八個都被設置成一的二進制位。好在這種可能性很小。我們把它稱為誤識概率。在上面的例子中,誤識概率在萬分之一以下。  
  18. 布隆過濾器的好處在于快速,省空間。但是有一定的誤識別率。常見的補救辦法是在建立一個小的白名單,存儲那些可能別誤判的郵件地址。 
  19.  
  20.  
  21. */ 
  22.  
  23. // 使用php程序來描述上面的算法  
  24.  
  25.  
  26. $set = array(1,2,3,4,5,6); 
  27. // 判斷5是否在$set 中  
  28.  
  29. $bloomFiter = array(0,0,0,0,0,0,0,0,0,0); 
  30.  
  31. // 通過某種算法改變$bloomFiter 中位數組表示集合,這里我們使用簡單的算法,把集合中對應的value 對應到bloom中的位置變成1  
  32.  
  33. // 算法如下  
  34.  
  35.  
  36. foreach($set as $key){ 
  37.  
  38. $bloomFiter[$key] = 1 ; 
  39.  
  40. var_dump($bloomFiter) ;  
  41.  
  42. //此時 $bloomFiter = array(1,1,1,1,1,1); 
  43.  
  44. //判斷是否在集合中 
  45.  
  46. if($bloomFiter[9] ==1){ 
  47. echo '在set 中';  
  48. }else
  49. echo '不在set 中' ; 
  50.  
  51.  
  52. // 上面只是一個簡單的例子,實際上哈希算法需要好幾個,但另一方面,如果哈希函數的個數少,那么位數組中的0就多 
  53.  
  54.  
  55. class bloom_filter { 
  56.  
  57. function __construct($hash_func_num=1, $space_group_num=1) { 
  58. $max_length = pow(2, 25); 
  59. $binary = pack('C', 0); 
  60.  
  61. //1字節占用8位 
  62. $this->one_num = 8; 
  63.  
  64. //默認32m*1 
  65. $this->space_group_num = $space_group_num
  66. $this->hash_space_assoc = array(); 
  67.  
  68. //分配空間 
  69. for($i=0; $i<$this->space_group_num; $i++){ 
  70. $this->hash_space_assoc[$i] = str_repeat($binary$max_length); 
  71.  
  72. $this->pow_array = array
  73. 0 => 1, 
  74. 1 => 2, 
  75. 2 => 4, 
  76. 3 => 8, 
  77. 4 => 16, 
  78. 5 => 32, 
  79. 6 => 64, 
  80. 7 => 128, 
  81. ); 
  82. $this->chr_array = array(); 
  83. $this->ord_array = array(); 
  84. for($i=0; $i<256; $i++){ 
  85. $chr = chr($i); 
  86. $this->chr_array[$i] = $chr
  87. $this->ord_array[$chr] = $i
  88.  
  89. $this->hash_func_pos = array
  90. 0 => array(0, 7, 1), 
  91. 1 => array(7, 7, 1), 
  92. 2 => array(14, 7, 1), 
  93. 3 => array(21, 7, 1), 
  94. 4 => array(28, 7, 1), 
  95. 5 => array(33, 7, 1), 
  96. 6 => array(17, 7, 1), 
  97. ); 
  98.  
  99. $this->write_num = 0; 
  100. $this->ext_num = 0; 
  101.  
  102. if(!$hash_func_num){ 
  103. $this->hash_func_num = count($this->hash_func_pos); 
  104. else
  105. $this->hash_func_num = $hash_func_num
  106.  
  107. function add($key) { 
  108. $hash_bit_set_num = 0; 
  109. // 離散key 
  110. $hash_basic = sha1($key); 
  111. // 截取前4位,然后十六進制轉換為十進制 
  112. $hash_space = hexdec(substr($hash_basic, 0, 4)); 
  113. // 取模 
  114. $hash_space = $hash_space % $this->space_group_num; 
  115.  
  116. for($hash_i=0; $hash_i<$this->hash_func_num; $hash_i++){ 
  117. $hash = hexdec(substr($hash_basic$this->hash_func_pos[$hash_i][0], $this->hash_func_pos[$hash_i][1])); 
  118. $bit_pos = $hash >> 3; 
  119. $max = $this->ord_array[$this->hash_space_assoc[$hash_space][$bit_pos]]; 
  120. $num = $hash - $bit_pos * $this->one_num; 
  121. $bit_pos_value = ($max >> $num) & 0x01; 
  122. if(!$bit_pos_value){ 
  123. $max = $max | $this->pow_array[$num]; 
  124. $this->hash_space_assoc[$hash_space][$bit_pos] = $this->chr_array[$max]; 
  125. $this->write_num++; 
  126. else
  127. $hash_bit_set_num++; 
  128. if($hash_bit_set_num == $this->hash_func_num){ 
  129. $this->ext_num++; 
  130. return true; 
  131. return false; 
  132.  
  133. function get_stat() { 
  134. return array
  135. 'ext_num' => $this->ext_num, 
  136. 'write_num' => $this->write_num, 
  137. ); 
  138.  
  139.  
  140. //test 
  141. //取6個哈希值,目前是最多7個 
  142. $hash_func_num = 6; 
  143.  
  144. //分配1個存儲空間,每個空間為32M,理論上是空間越大誤判率越低,注意php.ini中可使用的內存限制 
  145. $space_group_num = 1; 
  146.  
  147. $bf = new bloom_filter($hash_func_num$space_group_num); 
  148.  
  149. $list = array
  150. 'http://test/1'
  151. 'http://test/2'
  152. 'http://test/3'
  153. 'http://test/4'
  154. 'http://test/5'
  155. 'http://test/6'
  156. 'http://test/1'
  157. 'http://test/2'
  158. ); 
  159. foreach($list as $k => $v){ 
  160.  
  161. if($bf->add($v)){ 
  162. echo $v"/n"
  163. print_r($bf->get_stat()); 
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久国产成人精品| 久久久av免费| 久久久久久999| 国产精品国产亚洲伊人久久| 国产日韩欧美另类| 国产精品自拍视频| 欧美日韩第一视频| 亚洲成人黄色网| 亚洲天天在线日亚洲洲精| 国产精国产精品| 日韩电视剧在线观看免费网站| 亚洲深夜福利在线| 国产极品jizzhd欧美| 色综合伊人色综合网站| 亚洲 日韩 国产第一| 国产精品欧美风情| 国产精品电影网站| 国产91精品视频在线观看| 久久久99免费视频| 丝袜美腿亚洲一区二区| 久久久伊人欧美| 日韩在线观看电影| 国产精品美女主播| 亚洲免费人成在线视频观看| 日韩在线免费观看视频| 国产精品久久久久久久久久久不卡| 久久久欧美一区二区| 国外成人在线播放| 久久精品欧美视频| 国产精品白丝jk喷水视频一区| 精品国产91久久久久久| 色诱女教师一区二区三区| 国产欧美日韩中文字幕在线| 久热精品视频在线观看一区| 久久久久久一区二区三区| 日产日韩在线亚洲欧美| 久久久国产精品免费| 欧美精品videos另类日本| 日韩高清不卡av| 欧美激情欧美激情| 欧美精品videossex性护士| 亚洲精品电影久久久| 日韩a**站在线观看| 2019中文字幕在线观看| 欧美午夜激情在线| 亚洲精品视频中文字幕| 精品久久香蕉国产线看观看亚洲| 久久av中文字幕| 亲爱的老师9免费观看全集电视剧| 亚洲欧美一区二区精品久久久| 久久精品成人一区二区三区| 国模精品视频一区二区三区| 欧美成人精品xxx| 欧美另类暴力丝袜| 欧美激情视频在线免费观看 欧美视频免费一| 精品福利视频导航| 精品国内产的精品视频在线观看| 欧美日韩xxxxx| 奇米成人av国产一区二区三区| 亚洲精品久久7777777| 欧美成aaa人片免费看| 国产精品成人国产乱一区| 国产精品视频公开费视频| 午夜精品久久久久久久久久久久久| 久久久黄色av| 亚洲国产精品福利| 久久亚洲精品一区| 综合网日日天干夜夜久久| 国产精品视频成人| 国产精品久久久久国产a级| 欧美性xxxx18| 欧美黑人巨大精品一区二区| 欧美在线观看一区二区三区| 国产精品久久在线观看| 欲色天天网综合久久| 欧美另类高清videos| 精品亚洲一区二区三区在线播放| 色偷偷888欧美精品久久久| 日韩亚洲成人av在线| 亚洲va欧美va在线观看| 欧美精品videossex性护士| 亚洲电影免费观看高清完整版| 欧美日韩国内自拍| 欧美精品久久久久| 国产啪精品视频| 国产精品狠色婷| 亚洲精品自拍视频| 国产精品视频白浆免费视频| 亚洲视频免费一区| 91wwwcom在线观看| 欧美放荡办公室videos4k| 亚洲国产精品va在线看黑人| 亚洲人成77777在线观看网| 亚洲国产精品中文| 懂色av一区二区三区| 美女久久久久久久| 国产精品视频yy9099| 国产成人精品日本亚洲| 91香蕉亚洲精品| 日本精品视频在线| 国产精品色婷婷视频| 91理论片午午论夜理片久久| 欧美自拍视频在线| 久久国产精品视频| 日韩欧美在线免费| 亚洲另类xxxx| 日韩成人中文字幕在线观看| 国产精品日韩在线一区| 欧美丝袜第一区| 在线观看日韩www视频免费| 国产91ⅴ在线精品免费观看| 欧美精品生活片| 成人免费网站在线观看| 欲色天天网综合久久| 色婷婷av一区二区三区在线观看| 91影视免费在线观看| 91精品久久久久久久久久久久久久| 91国偷自产一区二区三区的观看方式| 91精品久久久久久久久久久| 国产色视频一区| 中文字幕亚洲一区在线观看| 午夜精品在线观看| 奇米4444一区二区三区| 久久久999精品视频| 亚洲大胆人体在线| 一区二区三区国产视频| 中文在线资源观看视频网站免费不卡| 色狠狠久久aa北条麻妃| 亚洲欧美国产精品专区久久| 91欧美精品午夜性色福利在线| 欧美精品videosex性欧美| 欧美性69xxxx肥| 亚洲最大福利视频| 色偷偷888欧美精品久久久| 久久精品国产精品亚洲| 欧美www视频在线观看| 在线观看国产精品日韩av| 国产精品电影网站| 91在线视频免费| 亚洲无线码在线一区观看| 丝袜亚洲另类欧美重口| 国产亚洲精品久久久优势| 欧美性受xxxx黑人猛交| 亚洲国产日韩欧美在线99| 国产精品视频中文字幕91| 久久91亚洲精品中文字幕奶水| 欧美电影免费观看高清完整| 国产美女91呻吟求| 日本精品一区二区三区在线播放视频| 日韩免费观看视频| 日韩av在线免费看| 一本一本久久a久久精品综合小说| 亚洲free嫩bbb| 国产精品久久精品| 国产精品久久久久久久久久久久久| 欧美日韩成人黄色| 亚洲精品视频中文字幕| 亚洲成人黄色网| 日韩在线观看精品| 黄网站色欧美视频| 欧美性69xxxx肥| 精品国内亚洲在观看18黄| 亚洲激情在线观看视频免费| 亚洲成人黄色在线观看|