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()