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

布隆過(guò)濾器就是利用的 bit

整體思想就是 
1個(gè)2進(jìn)制的  bit數(shù)組
和多個(gè)不同算法的hash
怎么整呢
就是比如 
我有16個(gè)bit相當(dāng)于2個(gè)字節(jié)  因?yàn)?個(gè)字節(jié)是8位 這個(gè)肯定大家都知道
因?yàn)閎it只能是 0 或者1   在因?yàn)椴悸∵^(guò)濾器的思想就是判斷存過(guò)的key是否存在
所以就簡(jiǎn)單了 就是整一堆2進(jìn)制bit數(shù)組

0 0 0 0    0 0 0 0    這是8位bit    數(shù)組肯定有下標(biāo) 
如果我存的key是  “中國(guó)”
上面講了有多個(gè)hash算法 那既然是多個(gè)hash算法對(duì) “中國(guó)”  hash肯定就得出來(lái)的數(shù)不一樣
比如 hash1算法(中國(guó)) =2      hash2算法(中國(guó))=5 
那么存的結(jié)果就是
0 0 0 1    0 0 1 0  第二位和第五位就都變成1了  ps我不確定bit數(shù)組下標(biāo)從0開始還是1開始所以就 假設(shè)他從1開始
所以在判斷中國(guó)存在不存在的時(shí)候 就根據(jù)兩次hash算法去對(duì)應(yīng)的下標(biāo)看是不是1, 如果是0肯定就沒有 
如果都是1 也不一定 就有 蹈胡。   為什么這么說(shuō) 因?yàn)槎鄠€(gè)hash算法就是為了避免hash碰撞出刷,但是我們學(xué)過(guò)hashmap都了解hash是肯定會(huì)碰撞的 所以 遇到  其他的key剛好和你碰撞了 就會(huì)進(jìn)行誤判了  所以 布隆過(guò)濾器主要是解決判斷這個(gè)這個(gè)key是否存儲(chǔ)過(guò)稳摄,如果多個(gè)hash的結(jié)果只要有一個(gè)bit位置是0那么這個(gè)key肯定就沒有布隆過(guò)濾器這個(gè)可以做的非常好   但是你得業(yè)務(wù)要是 對(duì)誤判可以接受那你可以判斷他是否有。下面給出本地實(shí)現(xiàn)和分布式實(shí)現(xiàn)蜕青。


ps 布隆過(guò)濾器最大的缺點(diǎn)就是 沒法刪除單獨(dú)的key為什么 因?yàn)槟銊h除了 你肯定就是把bit 設(shè)置成0 但是如果hash碰撞了 你設(shè)置成0了  就會(huì)影響其他的key了所以不能刪除
在一個(gè)就是誤判了 這個(gè)是我們可以預(yù)料到的。

1.本地布隆過(guò)濾器

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>20.0</version>
</dependency>


int expectedInsertions = 1000000; //預(yù)期插入多少個(gè)需要判斷的key
double fpp = 0.01; //錯(cuò)誤率 底層估計(jì)是 根據(jù)錯(cuò)誤率去算需要多少位 肯定錯(cuò)誤率越低占用內(nèi)存空間越大,估計(jì)還和hash算法有關(guān)
BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()), expectedInsertions, fpp);

//存數(shù)據(jù)
bloomFilter.put("hello");
bloomFilter.put("world");

//判斷是否存過(guò)數(shù)據(jù)
bloomFilter.mightContain("hello"); // true
bloomFilter.mightContain("world"); // true
bloomFilter.mightContain("test"); // false

2.分布式環(huán)境布隆過(guò)濾器

redission的實(shí)現(xiàn)
// 獲取布隆過(guò)濾器對(duì)象
RBloomFilter<String> bloomFilter = redisson.getBloomFilter("bloom-filter");
// 初始化布隆過(guò)濾器等太,設(shè)置預(yù)計(jì)元素?cái)?shù)量和誤判率
bloomFilter.tryInit(10000, 0.03);
// 添加元素
bloomFilter.add("hello");
bloomFilter.add("world");

// 判斷元素是否存在
System.out.println(bloomFilter.contains("hello"));
System.out.println(bloomFilter.contains("redis"));

// 清空過(guò)濾器
bloomFilter.delete();

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蛮放,隨后出現(xiàn)的幾起案子缩抡,更是在濱河造成了極大的恐慌,老刑警劉巖包颁,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞻想,死亡現(xiàn)場(chǎng)離奇詭異压真,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蘑险,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門滴肿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人佃迄,你說(shuō)我怎么就攤上這事泼差。” “怎么了呵俏?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵堆缘,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我柴信,道長(zhǎng)套啤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任随常,我火速辦了婚禮潜沦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绪氛。我一直安慰自己唆鸡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布枣察。 她就那樣靜靜地躺著争占,像睡著了一般。 火紅的嫁衣襯著肌膚如雪序目。 梳的紋絲不亂的頭發(fā)上臂痕,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音猿涨,去河邊找鬼握童。 笑死,一個(gè)胖子當(dāng)著我的面吹牛叛赚,可吹牛的內(nèi)容都是我干的澡绩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼俺附,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼肥卡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起事镣,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤步鉴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氛琢,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡只嚣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了艺沼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片册舞。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖障般,靈堂內(nèi)的尸體忽然破棺而出调鲸,到底是詐尸還是另有隱情,我是刑警寧澤挽荡,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布藐石,位于F島的核電站,受9級(jí)特大地震影響定拟,放射性物質(zhì)發(fā)生泄漏于微。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一青自、第九天 我趴在偏房一處隱蔽的房頂上張望株依。 院中可真熱鬧,春花似錦延窜、人聲如沸恋腕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)荠藤。三九已至,卻和暖如春获高,著一層夾襖步出監(jiān)牢的瞬間哈肖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工念秧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留淤井,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓出爹,卻偏偏與公主長(zhǎng)得像庄吼,于是被迫代替她去往敵國(guó)和親缎除。 傳聞我的和親對(duì)象是個(gè)殘疾皇子严就,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容