布隆過濾器(bloom filter)是2023年由布隆提出的。它實際上是乙個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。
**實現:
class bitmap
bitmap(size_t size)
// 1
void set(int data)
// data所在位元組的位元位置0
void reset(int data)
private:
std::vector
_table;
};
布隆過濾器用到的雜湊函式
#pragma once
#include
#include
using
namespace
std;
size_t getnextprim(size_t prev)//prev = 10
; for (size_t idx = 0; idx < _primesize; ++idx)
return -1;
}static size_t bkdrhash(const
char * str)
return (hash & 0x7fffffff);
}size_t sdbmhash(const
char* str)
return hash;
}size_t rshash(const
char *str)
return hash;
}size_t aphash(const
char* str)
else
}return hash;
}size_t jshash(const
char* str)
return hash;
}struct _hashfunc1
};struct _hashfunc2
};struct _hashfunc3
};struct _hashfunc4
};struct _hashfunc5
};
#include "bitmap.h"
#include "common.h"
//雜湊函式的用途就是將其他型別的元素轉換為整型。
template
k=string, class
hash1 = _hashfunc1, class
hash2 = _hashfunc1
,class
hash3 = _hashfunc3, class
hash4 = _hashfunc4, class
hash5 = _hashfunc5 >
class
bloomfilter
void set
(const
k & key)
//布隆過濾器只要有乙個雜湊函式計算到不在位圖中,這個元素就不在,相反如果計算後都在也有可能不在
bool find
(const
k & key)
if ( !_bitmap->test(hash2()
(key) % _capacity))
if ( !_bitmap->test(hash3()
(key) % _capacity))
if ( !_bitmap->test(hash4()
(key) % _capacity))
if ( !_bitmap->test(hash5()
(key) % _capacity))
return true;
}private:
bitmap *_bitmap;
int _capacity;
};
布隆過濾器的優點:
布隆過濾器儲存空間 插入和查詢都是o(1),另外, hash函式相互之間沒有關係,方便由硬體並行實現。布隆過濾器不需要儲存元素本身,在某些對保密要求非常嚴格的場合有優勢。
缺點:
誤算率是其中之一。隨著存入的元素數量增加,誤算率隨之增加
另外,一般情況下不能從布隆過濾器中刪除元素
如何擴充套件bloomfilter使得它支援刪除元素的操作?
因為乙個布隆過濾器的key對應多個位,衝突的概率比較大,所以不支援刪除,因為刪除有可能影響到其他元素。如果要對其元素進行刪除,就不得不對每乙個位進行引用計數。
#include "common.h"
//雜湊函式的用途就是將其他型別的元素轉換為整型。
template
k=string, class
hash1 = _hashfunc1, class
hash2 = _hashfunc1
,class
hash3 = _hashfunc3, class
hash4 = _hashfunc4, class
hash5 = _hashfunc5 >
class
bloomfiltercount
void set
(const
k & key)
void resit
(const
k &key)
//布隆過濾器只要有乙個雜湊函式計算到不在位圖中,這個元素就不在
bool find
(const
k & key)
//我們都知道,位圖非常的節省空間,但由於每一位都要引入乙個int,所以空間浪費還是比較嚴重的,
//因此不得不放棄點陣圖了
private:
vector_refbm;
size_t _capacity;
};
go實現布隆過濾器
布隆過濾器一般用來判斷乙個資料是否在乙個很大的資料集合裡面。當然可以用陣列,集合,樹等資料結構和各種查詢法都可以做同樣的事情,但是布隆過濾器有更好的時間效率和空間效率。位元幣實現spv節點時使用了布隆過濾器來查詢交易。布隆過濾器可以判斷乙個數在不在集合裡,但存在一定的誤判率。布隆過濾器的核心是乙個超...
redis之布隆過濾器
布隆過濾器是什麼?布隆過濾器可以理解為乙個不怎麼精確的 set 結構,當你使用它的 contains 方法判斷某個物件是否存在時,它可能會誤判。但是布隆過濾器也不是特別不精確,只要引數設定的合理,它的精確度可以控制的相對足夠精確,只會有小小的誤判概率 布隆過濾器基本使用 布隆過濾器有二個基本指令,b...
redis之布隆過濾器
參考 背景 布隆過濾器主要應用在redis快取穿透的場景中 大量查詢不存在的key,redis中不存在,就會將請求打到mysql之類的磁碟儲存裝置中,導致系統崩潰 快取穿透的解決方法 1.在redis中快取空值,就是將空的key也快取到redis中,但是會占用空間 2.使用布隆過濾器,將全部的有效資...