查黑名單(大數據 100億數據)
不理想的是:
1.使用哈希表來查(要使用非常大的空間)
2.改進:使用哈希分流,然后將使用多個計算機處理(浪費機器,代價高)
理想的是使用布隆過濾器(一種集合,但是有失誤率,不屬於黑名單的url可能會被認為在黑名單中,誤報):
使用的是基本數據類型的數組
然后使用數組中的bit位
如 int 型 數據 4個字節,32bit,int [] array = new int[1000];可以表示32*1000個位置
例:將某個位置描黑index:
1.這個bit位來自哪個整數:intIndex = index / 32
2.這個位置是這個整數的具體哪個bit:bitIndex = index % 32
3.描黑操作(找到相應的bit位):array[intIndex] = (array[intIndex] | (1 << bitIndex));
也可以用long類型的(64bit),
long [] array = new long[1000] 1000*64 個位置
long[][] array = new long[1000][1000] 1000*1000*64 個位置
每個url經過k個哈希函數(相互獨立的),對應相應位置上描黑,所有黑名單中每個url都描黑之后,整個布隆過濾器的數組相應位置就被描黑了
當檢查url時,計算k個哈希函數的位置,當所有的位置都是黑的的情況下,就認為在過濾器中,否則就不在
樣本量 n:100億, 失誤率 p:0.0001萬分之一
1.需要開的空間大小m 大小為bit:
m = 1,879,591,836,735 bit
其中n 為樣本量,p為預期失誤率
實際的字節 m / 8 1,879,591,836,735 bit / 8 = 234948979591字節 =23.3G(向上取整) 內存
2.哈希函數的個數k:
k = 13 (向上取整)
注:m和k向上取整
3.根據m和k向上取整之后,真實的失誤率:
p=6/十萬