當前位置:首頁 » 以太坊知識 » 以太坊bloom過濾

以太坊bloom過濾

發布時間: 2021-10-30 02:02:59

⑴ 布隆過濾器既然有錯誤率,為什麼還能應用在key-value系統中

bloom filter的特點是會出現誤報,但不會漏報,也就是說對於bloom filter驗證的一個數據文件,可能不包含你查找的數據項,但是包含你查找的數據項的數據文件它一定是會返回的,key-value系統中bloom filter返回的數據文件還是需要查看裡面的內容才能知道是否存在所需的數據的,這就保證了執行結果的正確性和完整性。因此key-value系統不會因此而出錯的,只是多訪問一些數據文件而已。在數據量很大key-value系統中,建立統一的B+樹索引的代價是非常大的,維護成本也很高,因此綜合起來bloom filter的性能是最好的。

⑵ 基於布隆過濾器的非法URL識別,有沒有能用Java

假如有1億個不重復的正整數(大致范圍已知),但是只有1G的內存可用,如何判斷該范圍內的某個數是否出現在這1億個數中?最常用的處理辦法是利用點陣圖,1*108/1024*1024*8=11.9,也只需要申請12M的內存。但是如果是1億個郵件地址,如何確定某個郵件地址是否在這1億個地址中?這個時候可能大家想到的最常用的辦法就是利用Hash表了,但是大家可以細想一下,如果利用Hash表來處理,必須開辟空間去存儲這1億個郵件地址,因為在Hash表中不可能避免的會發生碰撞,假設一個郵件地址只佔8個位元組,為了保證Hash表的碰撞率,所以需要控制Hash表的裝填因子在0.5左右,那麼至少需要2*8*108/1024*1024*1024=1.5G的內存空間,這種情況下利用Hash表是無法處理的。這個時候要用到另外一種數據結構-布隆過濾器(Bloom Filter),它是由Burton Howard Bloom在1970年提出的,它結合了點陣圖和Hash表兩者的優點,點陣圖的優點是節省空間,但是只能處理整型值一類的問題,無法處理字元串一類的問題,而Hash表卻恰巧解決了點陣圖無法解決的問題,然而Hash太浪費空間。針對這個問題,布隆提出了一種基於二進制向量和一系列隨機函數的數據結構-布隆過濾器。它的空間利用率和時間效率是很多演算法無法企及的,但是它也有一些缺點,就是會有一定的誤判率並且不支持刪除操作。

布隆過濾器的原理
1
布隆過濾器需要的是一個位數組(這個和點陣圖有點類似)和k個映射函數(和Hash表類似),在初始狀態時,對於長度為m的位數組array,它的所有位都被置為0

2
對於有n個元素的集合S={s1,s2......sn},通過k個映射函數{f1,f2,......fk},將集合S中的每個元素sj(1<=j<=n)映射為k個值{g1,g2......gk},然後再將位數組array中相對應的array[g1],array[g2]......array[gk]置為1:

3
如果要查找某個元素item是否在S中,則通過映射函數{f1,f2.....fk}得到k個值{g1,g2.....gk},然後再判斷array[g1],array[g2]......array[gk]是否都為1,若全為1,則item在S中,否則item不在S中。這個就是布隆過濾器的實現原理。
當然有讀者可能會問:即使array[g1],array[g2]......array[gk]都為1,能代表item一定在集合S中嗎?不一定,因為有這個可能:就是集合中的若干個元素通過映射之後得到的數值恰巧包括g1,g2,.....gk,那麼這種情況下可能會造成誤判,但是這個概率很小,一般在萬分之一以下。
很顯然,布隆過濾器的誤判率和這k個映射函數的設計有關,到目前為止,有很多人設計出了很多高效實用的hash函數。並且可以證明布隆過濾器的誤判率和位數組的大小以及映射函數的個數有關。假設誤判率為p,位數組大小為m,集合數據個數為n,映射函數個數為k,它們之間的關系如下:
p=2-(m/n)*ln2 可得 m=(-n*lnp)/(ln2)2=-2*n*lnp=2*n*ln(1/p)
k=(m/n)*ln2=0.7*(m/n)
可以驗證若p=0.1,(m/n)=9.6,即存儲每個元素需要9.6bit位,此時k=0.7*(m/n)=6.72,即存儲每個元素需要9.6個bit位,其中有6.72個bit位被置為1了,因此需要7個映射函數。從這里可以看出布隆過濾器的優越性了,比如上面例子中的,存儲一個郵件地址,只需要10個bit位,而用hash表存儲需要8*8=64個bit位。
一般情況下,p和n由用戶設定,然後根據p和n的值設計位數組的大小和所需的映射函數的個數,再根據實際情況來設計映射函數。
尤其要注意的是,布隆過濾器是不允許刪除元素的,因為若刪除一個元素,可能會發生漏判的情況。不過有一種布隆過濾器的變體Counter Bloom Filter,可以支持刪除元素,感興趣的讀者可以查閱相關文獻資料。
END
布隆過濾器的應用
布隆過濾器在很多場合能發揮很好的效果,比如:網頁URL的去重,垃圾郵件的判別,集合重復元素的判別,查詢加速(比如基於key-value的存儲系統)等,下面舉幾個例子:
1.有兩個URL集合A,B,每個集合中大約有1億個URL,每個URL佔64位元組,有1G的內存,如何找出兩個集合中重復的URL。
很顯然,直接利用Hash表會超出內存限制的范圍。這里給出兩種思路:
第一種:如果不允許一定的錯誤率的話,只有用分治的思想去解決,將A,B兩個集合中的URL分別存到若干個文件中{f1,f2...fk}和{g1,g2....gk}中,然後取f1和g1的內容讀入內存,將f1的內容存儲到hash_map當中,然後再取g1中的url,若有相同的url,則寫入到文件中,然後直到g1的內容讀取完畢,再取g2...gk。然後再取f2的內容讀入內存。。。依次類推,知道找出所有的重復url。
第二種:如果允許一定錯誤率的話,則可以用布隆過濾器的思想。
2.在進行網頁爬蟲時,其中有一個很重要的過程是重復URL的判別,如果將所有的url存入到資料庫中,當資料庫中URL的數量很多時,在判重時會造成效率低下,此時常見的一種做法就是利用布隆過濾器,還有一種方法是利用berkeley db來存儲url,Berkeley db是一種基於key-value存儲的非關系資料庫引擎,能夠大大提高url判重的效率。
布隆過濾器的簡易版本實現:
#include<iostream>
#include<bitset>
#include<string>
#define MAX 2<<24
using namespace std;

bitset<MAX> bloomSet; //簡化了由n和p生成m的過程

int seeds[7]={3, 7, 11, 13, 31, 37, 61}; //使用7個hash函數

int getHashValue(string str,int n) //計算Hash值
{
int result=0;
int i;
for(i=0;i<str.size();i++)
{
result=seeds[n]*result+(int)str[i];
if(result > 2<<24)
result%=2<<24;
}
return result;
}

bool isInBloomSet(string str) //判斷是否在布隆過濾器中
{
int i;
for(i=0;i<7;i++)
{
int hash=getHashValue(str,i);
if(bloomSet[hash]==0)
return false;
}
return true;
}

void addToBloomSet(string str) //添加元素到布隆過濾器
{
int i;
for(i=0;i<7;i++)
{
int hash=getHashValue(str,i);
bloomSet.set(hash,1);
}
}

void initBloomSet() //初始化布隆過濾器
{
addToBloomSet("http://www..com");
addToBloomSet("http://www.cnblogs.com");
addToBloomSet("http://www.google.com");
}

int main(int argc, char *argv[])
{

int n;
initBloomSet();
while(scanf("%d",&n)==1)
{
string str;
while(n--)
{
cin>>str;
if(isInBloomSet(str))
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}

}
return 0;
}

⑶ 如何使用bloomfilter構建大型Java緩存系統 bloomfilter

在如今的軟體當中,緩存是解決很多問題的一個關鍵概念。你的應用可能會進行CPU密集型運算。你當然不想讓這些運算一邊又一邊的重復執行,相反,你可以只執行一次, 把這個結果放在內存中作為緩存。有時系統的瓶頸在I/O操作上,比如你不想重復的查詢資料庫,你想把結果緩存起來,只在數據發生變化時才去數據查詢來更新緩存。
與上面的情況類似,有些場合下我們需要進行快速的查找來決定如何處理新來的請求。例如,考慮下面這種情況,你需要確認一個URL是否指向一個惡意網站,這種需求可能會有很多。如果我們把所有惡意網站的URL緩存起來,那麼會佔用很大的空間。或者另一種情況,需要確認用戶輸入的字元串是包含了美國的地名。像「華盛頓的博物館」——在這個字元串中,華盛頓是美國的一個地名。我們應該把美國所有的地名保存在內存中然後再查詢嗎?那樣的話緩存會有多大?是否能在不使用資料庫的前提下來高效地完成?
這就是為什麼我們要跨越基本的數據結構map,在更高級的數據結構像布隆過濾器(bloomfilter)中來尋找答案。你可以把布隆過濾器看做Java中的集合(collection),你可以往它裡面添加元素,查詢某個元素是否存在(就像一個HashSet)。如果布隆過濾器說沒有這個元素,這個結果可能是錯誤的。如果我們在設計布隆過濾器時足夠細心,我們可以把這種出錯的概率控制在可接受范圍內。

⑷ scrapy的pefilter和bloomfilter有什麼區別

使用scrapy-redis後,過濾重復的request不能使用原來scrapy的過去組件,要scrapy-redis的,在settings.py上配置DUPEFILTER_CLASS = "scrapy_redis.pefilter.RFPDupeFilter" 可以查看文檔!

⑸ 如何使用bloomfilter構建大型java緩存系統

在如今的軟體當中,緩存是解決很多問題的一個關鍵概念。你的應用可能會進行CPU密集型運算。你當然不想讓這些運算一邊又一邊的重復執行,相反,你可以只執行一次, 把這個結果放在內存中作為緩存。有時系統的瓶頸在I/O操作上,比如你不想重復的查詢資料庫,你想把結果緩存起來,只在數據發生變化時才去數據查詢來更新緩存。
與上面的情況類似,有些場合下我們需要進行快速的查找來決定如何處理新來的請求。例如,考慮下面這種情況,你需要確認一個URL是否指向一個惡意網站,這種需求可能會有很多。如果把所有惡意網站的URL緩存起來,那麼會佔用很大的空間。或者另一種情況,需要確認用戶輸入的字元串是包含了美國的地名。像「華盛頓的博物館」——在這個字元串中,華盛頓是美國的一個地名。應該把美國所有的地名保存在內存中然後再查詢嗎?那樣的話緩存會有多大?是否能在不使用資料庫的前提下來高效地完成?
這就是為什麼要跨越基本的數據結構map,在更高級的數據結構像布隆過濾器(bloomfilter)中來尋找答案。你可以把布隆過濾器看做Java中的集合(collection),你可以往它裡面添加元素,查詢某個元素是否存在(就像一個HashSet)。如果布隆過濾器說沒有這個元素,這個結果可能是錯誤的。如果在設計布隆過濾器時足夠細心,可以把這種出錯的概率控制在可接受范圍內。

⑹ 如何使用bloomfilter構建大型Java緩存系統

在如今的軟體當中,緩存是解決很多問題的一個關鍵概念。你的應用可能會進行CPU密集型運算。你當然不想讓這些運算一邊又一邊的重復執行,相反,你可以只執行一次, 把這個結果放在內存中作為緩存。有時系統的瓶頸在I/O操作上,比如你不想重復的查詢資料庫,你想把結果緩存起來,只在數據發生變化時才去數據查詢來更新緩存。
與上面的情況類似,有些場合下我們需要進行快速的查找來決定如何處理新來的請求。例如,考慮下面這種情況,你需要確認一個URL是否指向一個惡意網站,這種需求可能會有很多。如果我們把所有惡意網站的URL緩存起來,那麼會佔用很大的空間。或者另一種情況,需要確認用戶輸入的字元串是包含了美國的地名。像「華盛頓的博物館」——在這個字元串中,華盛頓是美國的一個地名。我們應該把美國所有的地名保存在內存中然後再查詢嗎?那樣的話緩存會有多大?是否能在不使用資料庫的前提下來高效地完成?
這就是為什麼我們要跨越基本的數據結構map,在更高級的數據結構像布隆過濾器(bloomfilter)中來尋找答案。你可以把布隆過濾器看做Java中的集合(collection),你可以往它裡面添加元素,查詢某個元素是否存在(就像一個HashSet)。如果布隆過濾器說沒有這個元素,那麼可以肯定不含有這個元素,但是如果布隆過濾器說有某個元素,那麼這個結果可能是錯誤的。如果我們在設計布隆過濾器時足夠細心,我們可以把這種出錯的概率控制在可接受范圍內。
解釋

布隆過濾器被設計為一個具有N的元素的位數組A(bit array),初始時所有的位都置為0.
添加元素
要添加一個元素,我們需要提供k個哈希函數。每個函數都能返回一個值,這個值必須能夠作為位數組的索引(可以通過對數組長度進行取模得到)。然後,我們把位數組在這個索引處的值設為1。例如,第一個哈希函數作用於元素I上,返回x。類似的,第二個第三個哈希函數返回y與z,那麼:
A[x]=A[y]=A[z] = 1

查找元素
查找的過程與上面的過程類似,元素將會被會被不同的哈希函數處理三次,每個哈希函數都返回一個作為位數組索引值的整數,然後我們檢測位數組在x、y與z處的值是否為1。如果有一處不為1,那麼就說明這個元素沒有被添加到這個布隆過濾器中。如果都為1,就說明這個元素在布隆過濾器裡面。當然,會有一定誤判的概率。
演算法優化
通過上面的解釋我們可以知道,如果想設計出一個好的布隆過濾器,我們必須遵循以下准則:
好的哈希函數能夠盡可能的返回寬范圍的哈希值。
位數組的大小(用m表示)非常重要:如果太小,那麼所有的位很快就都會被賦值為1,這樣就增加了誤判的幾率。
哈希函數的個數(用k表示)對索引值的均勻分配也很重要。
計算m的公式如下:
m = - nlog p / (log2)^2;

這里p為可接受的誤判率。
計算k的公式如下:
k = m/n log(2) ;

這里k=哈希函數個數,m=位數組個數,n=待檢測元素的個數(後面會用到這幾個字母)。
哈希演算法
哈希演算法是影響布隆過濾器性能的地方。我們需要選擇一個效率高但不耗時的哈希函數,在論文《更少的哈希函數,相同的性能指標:構造一個更好的布隆過濾器》中,討論了如何選用2個哈希函數來模擬k個哈希函數。首先,我們需要計算兩個哈希函數h1(x)與h2(x)。然後,我們可以用這兩個哈希函數來模仿產生k個哈希函數的效果:
gi(x) = h1(x) + ih2(x);

這里i的取值范圍是1到k的整數。
Google guava類庫使用這個技巧實現了一個布隆過濾器,哈希演算法的主要邏輯如下:

long hash64 = …; //calculate a 64 bit hash function
//split it in two halves of 32 bit hash values
int hash1 = (int) hash64;
int hash2 = (int) (hash64 >>> 32);
//Generate k different hash functions with a simple loop
for (int i = 1; i <= numHashFunctions; i++) {
int nextHash = hash1 + i * hash2;
}

應用
從數學公式中,我們可以很明顯的知道使用布隆過濾器來解決問題。但是,我們需要很好地理解布隆過濾器所能解決問題的領域。像我們可以使用布隆過濾器來存放美國的所有城市,因為城市的數量是可以大概確定的,所以我們可以確定n(待檢測元素的個數)的值。根據需求來修改p(誤判概率)的值,在這種情況下,我們能夠設計出一個查詢耗時少,內存使用率高的緩存機制。
實現
Google Guava類庫有一個實現,查看這個類的構造函數,在這裡面需要設置待檢測元素的個數與誤判率。
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;

//Create Bloomfilter
int expectedInsertions = ….;
double fpp = 0.03; // desired false positive probability
BloomFilter<CharSequence> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charse

⑺ 使用b+樹和使用bloom filter作為索引結構的區別

Bloom Filter是一種空間效率很高的隨機數據結構,它的原理是,當一個元素被加入集合時,通過K個Hash函數將這個元素映射成一個位陣列(Bit array)中的K個點,把它們置為1。檢索時,我們只要看看這些點是不是都是1就(大約)知道集合中有沒有它了:如果這些點有任何一個0,則被檢索元素一定不在;如果都是1,則被檢索元素很可能在。這就是布隆過濾器的基本思想。
但Bloom Filter的這種高效是有一定代價的:在判斷一個元素是否屬於某個集合時,有可能會把不屬於這個集合的元素誤認為屬於這個集合(false positive)。因此,Bloom Filter不適合那些「零錯誤」的應用場合。而在能容忍低錯誤率的應用場合下,Bloom Filter通過極少的錯誤換取了存儲空間的極大節省。
有人可能想知道它的中文叫法,倒是有被譯作稱布隆過濾器。該不該譯,譯的是否恰當,由諸君品之。下文之中,如果有諸多公式不慎理解,也無礙,只作稍稍了解即可。

⑻ 布隆過濾器的檢索效率為什麼快於哈希演算法

bloom filter的特點是會出現誤報,但不會漏報,也就是說對於bloom filter驗證的一個數據文件,可能不包含你查找的數據項,但是包含你查找的數據項的數據文件它一定是會返回的,key-value系統中bloom filter返回的數據文件還是需要查看裡面的內容...

⑼ 三國無雙4設置里的「紋理過濾器」選三線好還是雙線好還是~~

雙線過濾是最低的設置,三線效果會更好一些,負線最好

你提到的那三項應該是設置紋理、動態陰影效果的

熱點內容
比特幣提現擁堵 發布:2025-07-17 03:10:57 瀏覽:584
數字貨幣狂人是哪裡人 發布:2025-07-17 03:10:46 瀏覽:144
參加合約怎麼停機 發布:2025-07-17 03:00:39 瀏覽:974
手機全網管理礦機 發布:2025-07-17 02:42:24 瀏覽:153
期貨區塊鏈 發布:2025-07-17 02:38:54 瀏覽:390
比特幣2013年1月價格表 發布:2025-07-17 02:35:17 瀏覽:1000
區塊鏈用別人的身份證注冊 發布:2025-07-17 02:23:04 瀏覽:391
雙子星區塊鏈的邀請碼 發布:2025-07-17 02:19:59 瀏覽:727
誰能解釋清楚區塊鏈 發布:2025-07-17 02:09:28 瀏覽:930
幣網手機怎麼賣TRX幣提現 發布:2025-07-17 02:08:39 瀏覽:454