1. 程式人生 > >BloomFilter布隆過濾器

BloomFilter布隆過濾器

1、簡介:
BloomFilter是一個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索一個元素是否在一個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。
2、應用:
要判斷一個元素是否在一個集合中出現,一般情況下就是將這個集合的元素儲存下來,然後再到這個集合中一一比較即可,但是如果這個集合中的元素很多的話,不僅需要的記憶體很大,而且查詢起來也比較慢。
為了提高效率我們可以採用hash表,並且將集合中的元素都對映到bitmap中的一個位上,這樣的話就會節省空間和查詢的時間。但是由於雜湊衝突的原因,我們有可能會產生誤判,即不同的元素經過雜湊函式之後可能產生同一個地址。
為了降低誤判率,我們可以將一個元素經過多個雜湊函式,對映到多個位上,如果這幾個位上都為1,我們就認為這個元素是存在的,但是隻要有一個位為0,那麼這個元素就一定不存在。所以對於布隆過濾器來說,它的存在是不準確的,但是它的不存在一定是準確的。
3、布隆過濾器的刪除
布隆過濾器是用幾個位來表示一個數據的,如果要刪除該資料,那麼必須要將該資料對應的每一位置0,這必然會影響到別的資料,為此我們可以用引用計數的方式來記錄該位置被標記的次數

#pragma once
#include <iostream>
using namespace std;
#include "Bitmap.h"

struct __HashFunc1
{
    size_t BKDRHash(const char *str)
    {
        register size_t hash = 0;
        while (size_t ch = (size_t)*str++)
        {
            hash = hash * 131 + ch;
        }
        return hash;
    }

    size_t operator
()(const string& s) { return BKDRHash(s.c_str()); } }; struct __HashFunc2 { size_t SDBMHash(const char *str) { register size_t hash = 0; while (size_t ch = (size_t)*str++) { hash = 65599 * hash + ch; //hash = (size_t)ch + (hash << 6) + (hash << 16) - hash;
} return hash; } size_t operator()(const string& s) { return SDBMHash(s.c_str()); } }; struct __HashFunc3 { size_t RSHash(const char *str) { register size_t hash = 0; size_t magic = 63689; while (size_t ch = (size_t)*str++) { hash = hash * magic + ch; magic *= 378551; } return hash; } size_t operator()(const string& s) { return RSHash(s.c_str()); } }; struct __HashFunc4 { size_t APHash(const char *str) { register size_t hash = 0; size_t ch; for (long i = 0; ch = (size_t)*str++; i++) { if ((i & 1) == 0) { hash ^= ((hash << 7) ^ ch ^ (hash >> 3)); } else { hash ^= (~((hash << 11) ^ ch ^ (hash >> 5))); } } return hash; } size_t operator()(const string& s) { return APHash(s.c_str()); } }; struct __HashFunc5 { size_t JSHash(const char *str) { if (!*str) // 這是由本人新增,以保證空字串返回雜湊值0 return 0; register size_t hash = 1315423911; while (size_t ch = (size_t)*str++) { hash ^= ((hash << 5) + ch + (hash >> 2)); } return hash; } size_t operator()(const string& s) { return JSHash(s.c_str()); } }; template<class K = string, class HashFunc1 = __HashFunc1, class HashFunc2 = __HashFunc2, class HashFunc3 = __HashFunc3, class HashFunc4 = __HashFunc4, class HashFunc5 = __HashFunc5> class BloomFilter { public: // n表示儲存n個key BloomFilter(size_t n) :_bs(10 * n) , _range(10 * n) {} void Set(const K& key) { size_t hash1 = HashFunc1()(key); size_t hash2 = HashFunc2()(key); size_t hash3 = HashFunc3()(key); size_t hash4 = HashFunc4()(key); size_t hash5 = HashFunc5()(key); _bs.Set(hash1 % _range); _bs.Set(hash2 % _range); _bs.Set(hash3 % _range); _bs.Set(hash4 % _range); _bs.Set(hash5 % _range); } bool Test(const K& key) { size_t hash1 = HashFunc1()(key); if (_bs.Test(hash1%_range) == false) return false; size_t hash2 = HashFunc2()(key); if (_bs.Test(hash2%_range) == false) return false; size_t hash3 = HashFunc3()(key); if (_bs.Test(hash3%_range) == false) return false; size_t hash4 = HashFunc4()(key); if (_bs.Test(hash4%_range) == false) return false; size_t hash5 = HashFunc5()(key); if (_bs.Test(hash5%_range) == false) return false; return true; // 可能存在誤判 } protected: BitSet _bs; size_t _range; }; void TestBloomFilter() { BloomFilter<> bf(100); string url1 = "http://www.cplusplus.com/1"; string url2 = "http://www.cplusplus.com/2"; string url3 = "http://www.cplusplus.com/3"; string url4 = "http://www.cplusplus.com/4"; string url5 = "http://www.cplusplus.com/5"; string url6 = "http://www.cplusplus.com/6"; bf.Set(url1); bf.Set(url2); bf.Set(url3); bf.Set(url4); bf.Set(url5); bf.Set("bitset"); bf.Set("peter"); bf.Set("pxxxxxxxxxx"); cout << "url1?" << bf.Test(url1) << endl; cout << "url2?" << bf.Test(url2) << endl; cout << "url3?" << bf.Test(url3) << endl; cout << "url4?" << bf.Test(url4) << endl; cout << "url5" << bf.Test(url5) << endl; cout << "url6?" << bf.Test(url6) << endl; cout << "peter?" << bf.Test("peter") << endl; cout << "peter son?" << bf.Test("peter son") << endl; }

相關推薦

第三百五十八節,Python分式爬蟲打造搜索引擎Scrapy精講—將bloomfilter(過濾器)集成到scrapy-redis中

分布式爬蟲 times 操作 加載 ger 目錄 需要 ini space 第三百五十八節,Python分布式爬蟲打造搜索引擎Scrapy精講—將bloomfilter(布隆過濾器)集成到scrapy-redis中,判斷URL是否重復 布隆過濾器(Bloom Filte

BloomFilter(過濾器)

但是 同時 see oom font 關聯 代碼實現 filter func 原文鏈接:http://blog.csdn.net/qq_38646470/article/details/79431659 1.概念: 如果想判斷一個元素是不是在一個集合裏,一般想到的是將所有元

BloomFilter過濾器的使用

<dependency>             <groupId>com.google.guava</groupId>            

BloomFilter(過濾器)原理和python支援庫

簡介   Bloom Filter(布隆過濾器)是一種多雜湊函式對映的快速查詢演算法。通常應用在需要快速判斷一個元素是否屬於集合,但是並不是嚴格要求100%正確的場合。   即Bloom Filter是會誤判的,但是它只會把不存在於集合中的元素誤判成存在

Java基礎知識總結--BloomFilter(過濾器)

前言   對映是個非常有意思的東西。hash函式是把任意型別的資料對映成等長的位元組碼,用於快速查詢,加密等;   bitmap 類似桶排序,最大的數是多少,就有多少位,一個數存不存在就看對應的位

BloomFilter過濾器

1、簡介: BloomFilter是一個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索一個元素是否在一個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。 2、應用: 要判斷一個元素是否在一個集合

BloomFilter過濾器的java實現

網上有很多的原理解釋說明,此處不再對bloom filter做過多的說明,直接上程式碼(注:程式碼參考了網上其他部落格的實現,比如布隆過濾器(Bloom Filter)Java實現) /**   * 專案名:SpiderCrawler   * 檔名:BloomFil

BloomFilter(過濾器)的C#實現

BloomFilterTest的程式碼如下: static void Main() { BloomFilter<string> bf = new BloomFilter<string>(20, 3);

BloomFilter過濾器使用

從上一篇可以得知,BloomFilter的關鍵在於hash演算法的設定和bit陣列的大小確定,通過權衡得到一個錯誤概率可以接受的結果。 演算法比較複雜,也不是我們研究的範疇,我們直接使用已有的實現。 google的guava包中提供了BloomFilter類,我們直接使用

BloomFilter 過濾器

private BloomFilter<String> bf =null; //等效成一個set集合 @

【資料結構】點陣圖BitMap與過濾器BloomFilter

  首先先看一下下面這個騰訊的面試題:給40億個不重複的無符號整數,沒排過序。給一個無符號整數,如何快速判斷一個數是否在這40億個數中。 【騰訊】思路一:  最容易想到的解法就是遍歷所有的40多億個整數,然後一個一個判斷。但是這個需要花費的記憶體是多大呢?  大家可以去算一下

java實現去重過濾器(BloomFilter)

最近用到在list中找出重複的元素,實現結果給大家分享一下,自己也當做一個筆記。 在網上找的布隆過濾器(BloomFilter)類的實現: public class BloomFilter { private static final int DEFAULT_SIZE =

網路爬蟲:URL去重策略之過濾器(BloomFilter)的使用

前言:   最近被網路爬蟲中的去重策略所困擾。使用一些其他的“理想”的去重策略,不過在執行過程中總是會不太聽話。不過當我發現了BloomFilter這個東西的時候,的確,這裡是我目前找到的最靠譜的一種方法。   如果,你說URL去重嘛,有什麼難的。那麼你可

過濾器BloomFilter

一、布隆過濾器[1] 布隆過濾器(Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的。它實際上是由一個很長的二進位制向量和一系列隨機對映函式組成,布隆過濾器可以用於檢索一個元素是否在一個集合中。它的優點是空間效率和查詢時間都遠

【淺析】|白話過濾器BloomFilter

通過本文將瞭解到以下內容: 查詢問題的一般思路 布隆過濾器的基本原理 布隆過濾器的典型應用 布隆過濾器的工程實現 場景說明: 本文闡述的場景均為普通單機伺服器、並非分散式大資料平臺,因為在大資料平臺下問題就是另外一種考慮方式了,因此本文只描述貧窮落後一窮二白的場景,儼然有種60年代先輩們在戈壁攻克原子彈的

Bloom Filter過濾器

布隆過濾器 數據及結構 原文鏈接:http://blog.csdn.net/qq_38646470/article/details/794316591.概念:如果想判斷一個元素是不是在一個集合裏,一般想到的是將所有元素保存起來,然後通過比較確定。鏈表,樹等等數據結構都是這種思路. 但是隨著集合中元素的

Bloom filter(過濾器)概念與原理

概念 int 復雜 gravity water pac 基數 AS class https://en.wikipedia.org/wiki/Bloom_filter 寫在前面 在大數據與雲計算發展的時代,我們經常會碰到這樣的問題。我們是否能高效的判斷一個用

使用MR編程hbase和hbase調優-過濾器

style zook 存儲空間 del 使用 字節數 permsize 判斷 enabled 使用MR編程操縱hbase ====================================== 1、TableInputFormat輸入K,V格式

過濾器的方式解決緩存穿透問題

元素 分享 http enc 輸出結果 思路 支持 負載 根據 1、原理 布隆過濾器的巨大用處就是,能夠迅速判斷一個元素是否在一個集合中。因此他有如下三個使用場景: 網頁爬蟲對URL的去重,避免爬取相同的URL地址 反垃圾郵件,從數十億個垃圾郵件列表中

過濾器之Python+Redis

ini ros 如果 函數的參數 cccccc pytho 變化 ear ember 簡單的python實現 pip install mmh3 對於安裝報錯,c++編譯錯誤問題:可以安裝 Microsoft Visual C++ Build Tools()