偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

布隆過(guò)濾器的原理以及使用場(chǎng)景

存儲(chǔ) 存儲(chǔ)軟件
布隆過(guò)濾器主要是在redis中問(wèn)的比較多,因此像這種數(shù)據(jù)結(jié)構(gòu)類的,主要是考原理以及使用場(chǎng)景。下面一點(diǎn)一點(diǎn)開(kāi)始逐步介紹。

[[349127]]

這一篇是我重寫的,之前寫過(guò)一篇發(fā)現(xiàn)面試的時(shí)候問(wèn)的問(wèn)題雖然大概能解決,但是有幾個(gè)點(diǎn)沒(méi)有整理到位,所以自己給自己列出了很多面試常見(jiàn)的問(wèn)題,準(zhǔn)備一篇一篇去解決。本文整體思路是延續(xù)之前的那篇文章,在此基礎(chǔ)之上添加了幾個(gè)點(diǎn)而已。

布隆過(guò)濾器主要是在redis中問(wèn)的比較多,因此像這種數(shù)據(jù)結(jié)構(gòu)類的,主要是考原理以及使用場(chǎng)景。下面一點(diǎn)一點(diǎn)開(kāi)始逐步介紹。

一、認(rèn)識(shí)布隆過(guò)濾器

1、概念

布隆過(guò)濾器其實(shí)就是加快判定一個(gè)元素是否在集合中出現(xiàn)的方法。比如說(shuō)在一個(gè)大字典中,要查找某個(gè)單詞是否存在,于是我們就可以使用布隆過(guò)濾器,快速高效省時(shí)省力。

這里有一個(gè)考察點(diǎn),那就是布隆過(guò)濾器只能判定一個(gè)元素不在集合里面,不能判斷存在,什么意思呢!就是說(shuō)一個(gè)蘋果不在籃子里,這個(gè)我可以通過(guò)布隆過(guò)濾器知道,但是一定在籃子里嘛?這個(gè)通過(guò)布隆過(guò)濾器我是不能判定的。

下面通過(guò)原理就能理解這個(gè)了。

2、原理

先舉一個(gè)例子,在我們身邊充斥著各種各樣的XX網(wǎng)站,為了不毒害我們祖國(guó)的花朵,于是國(guó)家網(wǎng)警就開(kāi)始對(duì)這些網(wǎng)站進(jìn)行割除過(guò)濾,問(wèn)題來(lái)了,這些網(wǎng)站的地址其實(shí)是不停的更換的,這些垃圾網(wǎng)站和正常網(wǎng)站加起來(lái)全世界據(jù)統(tǒng)計(jì)也有幾十億個(gè)。因此就會(huì)帶來(lái)如下的問(wèn)題:

(1)網(wǎng)站數(shù)量太多,存儲(chǔ)起來(lái)比較麻煩。一個(gè)地址最起碼有32個(gè)字節(jié),一億個(gè)地址就需要1.6G的內(nèi)存。

(2)一個(gè)一個(gè)比較,太費(fèi)時(shí)間了。

因此布隆過(guò)濾器被設(shè)計(jì)出來(lái)了,他是如何做到高效的呢?本質(zhì)上其實(shí)就是一個(gè)HASH映射器。他的底層其實(shí)是一個(gè)超大的二進(jìn)制向量和一系列隨機(jī)映射函數(shù)。現(xiàn)在我們按照之前的那個(gè)例子,我們存儲(chǔ)1億個(gè)垃圾網(wǎng)站地址。

(1)第一步:建立一個(gè)32億二進(jìn)制(比特),也就是4億字節(jié)的向量。全部置0。

img

(2)第二步:網(wǎng)警用八個(gè)不同的隨機(jī)數(shù)產(chǎn)生器(F1,F2, …,F8) 產(chǎn)生八個(gè)信息指紋(f1, f2, …, f8)。

(3)第三步:用一個(gè)隨機(jī)數(shù)產(chǎn)生器 G 把這八個(gè)信息指紋映射到 1 到32億中的八個(gè)自然數(shù) g1, g2, …,g8。

(4)第四步:把這八個(gè)位置的二進(jìn)制全部設(shè)置為一。

img

OK,有一天網(wǎng)警查到了一個(gè)可疑的網(wǎng)站,想判斷一下是否是XX網(wǎng)站,于是就開(kāi)始檢查了。通過(guò)同樣的方法將XX網(wǎng)站通過(guò)哈希映射到32億個(gè)比特位數(shù)組上的8個(gè)點(diǎn)。如果8個(gè)點(diǎn)的其中有一個(gè)點(diǎn)不為1,則可以判斷該元素一定不存在集合中。

注意:現(xiàn)在你可能會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題,如果兩個(gè)XX網(wǎng)站通過(guò)上面的步驟映射到了相同的8個(gè)點(diǎn)上,或者是有一部分點(diǎn)是重合的,這時(shí)候該怎么辦?于是就出現(xiàn)了誤報(bào),也就是說(shuō)A網(wǎng)站在12345678個(gè)點(diǎn)上全部置1,B網(wǎng)站通過(guò)同樣的方式在23456789上全部置1,這時(shí)候B網(wǎng)站來(lái)了是不能確定是否包含的。這個(gè)邏輯相信各位都理解。這個(gè)是最基礎(chǔ)的面試問(wèn)題。

3、誤報(bào)率

這一小節(jié)是稍微高級(jí)一點(diǎn)點(diǎn),某中廠問(wèn)到了一次,于是這一次就添加了進(jìn)來(lái)。

通過(guò)上面的解釋相信都大概了解的差不多了,其實(shí)就是hash函數(shù)映射,由于有hash沖突產(chǎn)生了誤報(bào)率,誤報(bào)率也就是判斷失敗的情況。

既然是由于hash沖突,那我把布隆過(guò)濾器的二進(jìn)制向量調(diào)到很大,這樣不就解決了嘛,但是由于數(shù)據(jù)量比較大,因此現(xiàn)在就要考慮一下誤報(bào)率和存儲(chǔ)效率之間選擇一個(gè)折中值了。有一個(gè)計(jì)算公式如下:公式來(lái)源于github

假設(shè)位數(shù)組的長(zhǎng)度為m,哈希函數(shù)的個(gè)數(shù)為k。檢測(cè)某一元素是否在該集合中的誤報(bào)率是:

[公式]

如何使得誤報(bào)率最小,數(shù)學(xué)問(wèn)題,求導(dǎo)就可以了。

4、使用場(chǎng)景

(1)google的guava包中有對(duì)Bloom Filter的實(shí)現(xiàn)

(2)通常使用布隆過(guò)濾器去解決redis中的緩存穿透,解決方案是redis中bitmap的實(shí)現(xiàn),

(3)釣魚網(wǎng)站、垃圾郵件檢測(cè)

大體就這些,可能還有很多!!!

二、代碼實(shí)現(xiàn)布隆過(guò)濾器

上面只是給出了其原理,下面我們代碼實(shí)現(xiàn)一下。

  1. public   class  MyBloomFilter { 
  2.     // 2 << 25表示32億個(gè)比特位 
  3.      private static final int DEFAULT_SIZE =  2 << 25 ; 
  4.      private static final int[] seeds = new int [] {3,5,7,11,13,19,23,37 }; 
  5.      //這么大存儲(chǔ)在BitSet 
  6.      private  BitSet  bits = new BitSet(DEFAULT_SIZE); 
  7.      private  SimpleHash[] func  = new  SimpleHash[seeds.length]; 
  8.  
  9.      public   static   void  main(String[] args) { 
  10.         //可疑網(wǎng)站 
  11.         String value = "www.愚公要移山.com" ; 
  12.         MyBloomFilter filter = new MyBloomFilter(); 
  13.         //加入之前判斷一下 
  14.         System.out.println(filter.contains(value)); 
  15.         filter.add(value); 
  16.         //加入之后判斷一下 
  17.         System.out.println(filter.contains(value)); 
  18.     } 
  19.     //構(gòu)造函數(shù) 
  20.      public  MyBloomFilter() { 
  21.          for  ( int  i  =   0 ; i  <  seeds.length; i ++ ) { 
  22.             func[i]  =   new  SimpleHash(DEFAULT_SIZE, seeds[i]); 
  23.         } 
  24.     } 
  25.      //添加網(wǎng)站 
  26.      public   void  add(String value) { 
  27.          for  (SimpleHash f : func) { 
  28.             bits.set(f.hash(value),  true ); 
  29.         } 
  30.     } 
  31.      //判斷可疑網(wǎng)站是否存在 
  32.      public   boolean  contains(String value) { 
  33.          if  (value  ==   null ) { 
  34.              return   false ; 
  35.         } 
  36.          boolean  ret  =   true ; 
  37.          for  (SimpleHash f : func) { 
  38.             //核心就是通過(guò)“與”的操作 
  39.             ret  =  ret  &&  bits.get(f.hash(value)); 
  40.         } 
  41.          return  ret; 
  42.     } 

還有一個(gè)SimpleHash,我們看一下

  1. public   static   class  SimpleHash { 
  2.         private  int  cap; 
  3.         private  int  seed; 
  4.  
  5.         public  SimpleHash( int  cap,  int  seed) { 
  6.             this .cap  =  cap; 
  7.             this .seed  =  seed; 
  8.        } 
  9.         public   int  hash(String value) { 
  10.             int  result  =   0 ; 
  11.             int  len  =  value.length(); 
  12.             for  ( int  i  =   0 ; i  <  len; i ++ ) { 
  13.                result  =  seed  *  result  +  value.charAt(i); 
  14.            } 
  15.             return  (cap  -   1 )  &  result; 
  16.        } 
  17.    } 

這就是布隆過(guò)濾器的實(shí)現(xiàn)。

本文轉(zhuǎn)載自微信公眾號(hào)「愚公要移山」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系愚公要移山公眾號(hào)。

 

 

責(zé)任編輯:武曉燕 來(lái)源: 愚公要移山
相關(guān)推薦

2024-01-05 09:04:35

隆過(guò)濾器數(shù)據(jù)結(jié)構(gòu)哈希函數(shù)

2023-04-26 08:32:45

Redis布隆過(guò)濾器

2024-11-04 08:45:48

布隆過(guò)濾器元數(shù)據(jù)指紋值

2024-03-15 11:21:22

布隆過(guò)濾器數(shù)據(jù)庫(kù)數(shù)據(jù)

2022-03-21 08:31:07

布隆過(guò)濾器Redis過(guò)濾器原理

2024-09-18 10:08:37

2025-04-30 08:47:41

2025-02-08 17:30:00

布隆過(guò)濾器數(shù)據(jù)結(jié)構(gòu)

2024-03-04 10:24:34

布隆過(guò)濾器C#代碼

2021-03-06 14:41:07

布隆過(guò)濾器算法

2023-01-31 08:19:53

二進(jìn)制元素數(shù)量

2025-01-23 00:00:00

Java布隆過(guò)濾器

2019-03-22 15:15:25

Redis緩存擊穿雪崩效應(yīng)

2021-09-03 06:33:24

布隆過(guò)濾器高并發(fā)

2025-01-22 00:00:00

布隆過(guò)濾器二進(jìn)制

2024-09-25 17:44:08

2024-10-09 15:54:38

布隆過(guò)濾器函數(shù)

2023-07-06 10:15:38

布隆過(guò)濾器優(yōu)化

2020-08-28 13:02:17

布隆過(guò)濾器算法

2025-02-25 00:11:40

Servlet服務(wù)器Web
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)