布隆過濾器是一種概率型資料結構,能明確告知某個字串一定不存在或者可能存在,直觀說是hash set,不儲存key,通過k個hash值,儲存k個標誌位,k個標誌位均為1,表示可能存在;否則一定不存在。
布隆過濾器解決的問題是,海量資料查詢。紅黑樹的需要key比較和儲存key;雜湊表的儲存key,以及碰撞後的key比較。所以需要嘗試探尋不儲存key的方案,並且擁有雜湊表的優點(不需要比較字串)。
布隆過濾器優點:需要儲存空間小;不需要比較,查詢快。
布隆過濾器缺點:不支援刪除操作;key有概率不存在集合裡。
應用場景:
幾個概念:
1、負載因子:陣列儲存元素的個數/陣列長度;負載因子越小,衝突越小;負載因子越大,衝突越大。既是佔用率。
2、雜湊函式:把任意長度的而輸入通過雜湊演算法換成固定長度的輸出。要求:計算速度快;相似字串能保持強隨機分布型(防碰撞)
例如,md5、sha1、sha256,一般用於資訊保安(簽名和加密);murmurhash,cityhash,不適用於加密,但適合用在雜湊表
3、線性探查與同類雜湊聚集:不同key,對映到雜湊表的相同位置時,線性探查採用i+1,i+2的方式找空位,會導致同類雜湊的聚集。
4、二次探查:採用方式為i+1²,i-1²,i+2²,i-2²,i+3²,i-3²......延緩同類雜湊聚集,仍會導致同類雜湊聚集。
5、二度雜湊(雙重雜湊):
在.net hashtable類的hash函式hk定義如下:
hk(key) = [gethash(key) + k * (1 + (((gethash(key) >> 5) + 1) % (hashsize – 1)))] % hashsize
6、n,p,m,k推導過程
**:#include #include #include #include #include #define byte_bits (8)
#define mix_uint64(v) ((uint32_t)((v>>32)^(v)))
#define setbit(filter, n) (filter->pstfilter[n/byte_bits] |= (1 << (n%byte_bits)))
#define getbit(filter, n) (filter->pstfilter[n/byte_bits] & (1 << (n%byte_bits)))
typedef struct basebloomfilter;
void _calcbloomfilterparam(uint32_t n,double p, uint32_t *pm,uint32_t *pk)
int initbloomfilter(basebloomfilter* pstbloomfilter, \
uint32_t dwseed, uint32_t dwmaxitems, double dprobfalse)
if(pstbloomfilter->pstfilter != null)
if(pstbloomfilter->pdwhashpos != null)
pstbloomfilter->dwmaxitems = dwmaxitems;
pstbloomfilter->dprobfalse = dprobfalse;
pstbloomfilter->dwseed = dwseed;
_calcbloomfilterparam(pstbloomfilter->dwmaxitems,pstbloomfilter->dprobfalse,\
&pstbloomfilter->dwfilterbits,&pstbloomfilter->dwhashfuncs);
pstbloomfilter->dwfiltersize = pstbloomfilter->dwfilterbits / byte_bits;
pstbloomfilter->pstfilter = (unsigned char *) malloc(pstbloomfilter->dwfiltersize);
if(null == pstbloomfilter->pstfilter)
pstbloomfilter->pdwhashpos = (uint32_t *) malloc(sizeof(uint32_t) * pstbloomfilter->dwhashfuncs);
if(null == pstbloomfilter->pdwhashpos)
printf(">>> init bloomfilter(n=%u, p=%e, m=%u, k=%d), malloc() size=%.2fmb, items:bits=1:%0.1lf\n",
pstbloomfilter->dwmaxitems, pstbloomfilter->dprobfalse, pstbloomfilter->dwfilterbits,
pstbloomfilter->dwhashfuncs, (double)pstbloomfilter->dwfiltersize/1024/1024,
pstbloomfilter->dwfilterbits*1.0/pstbloomfilter->dwmaxitems);
memset(pstbloomfilter->pstfilter,0,pstbloomfilter->dwfiltersize);
return 0;
}int freebloomfilter(basebloomfilter *pstbloomfilter)
free(pstbloomfilter->pstfilter);
pstbloomfilter->pstfilter = null;
free(pstbloomfilter->pdwhashpos);
pstbloomfilter->pdwhashpos = null;
return 0;
}//
uint64_t murmurhash2_x64 ( const void * key, int len, uint32_t seed )
const uint8_t * data2 = (const uint8_t*)data;
switch(len & 7)
;h ^= h >> r;
h *= m;
h ^= h >> r;
return h;
}// 雙重雜湊封裝
void bloom_hash(basebloomfilter *pstbloomfilter, const void * key, int len)
return;
}int bloomfilter_add(basebloomfilter *pstbloomfilter, const void* key,int len)
bloom_hash(pstbloomfilter,key,len);
int i;
for(i=0;i<(int)pstbloomfilter->dwhashfuncs;i++)
return 0;
}int bloomfilter_check(basebloomfilter *pstbloomfilter, const void* key, int len)
bloom_hash(pstbloomfilter,key,len);
int i;
for(i=0;i<(int)pstbloomfilter->dwhashfuncs;i++)
}return 0;
}int main();
initbloomfilter(&stbloomfilter,0,max_items,p_error);
char url[128] = ;
int i;
for(i=0;i參考
零聲學院
murmurhash
cityhash
雙重雜湊
布隆過濾器
布隆過濾器 bloom filter 是1970年由布隆提出的。它實際上是乙個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。如果想要判斷乙個元素是不是在乙個集合裡,一般想到...
布隆過濾器
布隆過濾器的概念 如果想要判斷乙個元素是不是在乙個集合裡,一般想到的是將所有元素儲存起來,然後通過比較確定。鍊錶,樹等等資料結構都是這種思路.但是隨著集合中元素的增加,我們需要的儲存空間越來越大,檢索速度也越來越慢 o n o logn 不過世界上還有一種叫作雜湊表 又叫 雜湊表,hash tabl...
布隆過濾器
如果想判斷乙個元素是不是在乙個集合裡,一般想到的是將集合中所有元素儲存起來,然後通過比較確定。鍊錶 樹 雜湊表 又叫雜湊表,hash table 等等資料結構都是這種思路。但是隨著集合中元素的增加,我們需要的儲存空間越來越大。同時檢索速度也越來越慢。bloom filter 是一種空間效率很高的隨機...