1 4 布隆過濾器

2021-10-17 20:37:42 字數 3851 閱讀 3250

布隆過濾器是一種概率型資料結構,能明確告知某個字串一定不存在或者可能存在,直觀說是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 是一種空間效率很高的隨機...