Bloom Filter演算法優化

2021-08-27 05:06:53 字數 2054 閱讀 1199

基於redis的bloom filter去重,利用redis的string資料結構,但redis的string最大只能512m,所以資料過大的時候,需要申請多個去重塊。

bloom filter對乙個很長的字串進行雜湊對映時會出錯,常誤判為已經存在,所以我們進行一次壓縮(md5\sha1)。

將去重佇列和種子佇列拆分到不同的機器上。

種子seed數量越少去重速度越快,但是漏失率越大。

md5長度為128bit,sha-1長度160bit。

from redis import strictredis

from hashlib import md5

class hashmap(object):

def __init__(self, m, seed):

self.m = m

self.seed = seed

def hash(self, value):

ret = 0

for i in range(len(value)):

ret += self.seed * ret + ord(value[i])

return (self.m - 1) & ret

class bloomfilter(object):

def __init__(self, server, key, blocknum=1, bit=30, hash_number=6):

self.m = 1 << bit

self.seeds = range(hash_number) # 種子

self.blocknum = blocknum # 去重塊的數量

self.maps = [hashmap(self.m, seed) for seed in self.seeds] # 多個雜湊函式

self.server = server # redis連線物件

self.key = key # 鍵名

def exists(self, value):

if not value:

return false

m5 = md5()

m5.update(value.encode())

value_md5 = m5.hexdigest() # 將value進行md5加密

ret = true

key_name = self.key + \

str(int(value_md5[0:2], 16) % self.blocknum) # 儲存的block位置

for map in self.maps:

offset = map.hash(value_md5) # hash md5加密後的資料

ret = ret & self.server.getbit(

key_name, offset) # 修改每次hash過後,指定block塊的位置

return ret

def insert(self, value):

m5 = md5()

m5.update(value.encode())

value_md5 = m5.hexdigest() # 將vlaue進行md5加密

key_name = self.key + \

str(int(value_md5[0:2], 16) % self.blocknum) # 儲存的block位置

for map in self.maps:

offset = map.hash(value_md5) # hash md5加密後的資料

self.server.setbit(key_name, offset, 1)

redis = strictredis(host='localhost', port=6379)

bf = bloomfilter(redis, 'hash_map', 3, 10, 1)

# bf.insert('asd')

print(bf.exists('asd'))

# bf.insert('hellow')

# bf.insert('world')

Bloom Filter演算法 簡介

bloom filter演算法 其實可以看作 bit map 的一種擴充套件。它把已存在的元素通過多個hash 函式對映到乙個 bit 序列,對於每乙個元素根據hash函式的結果把相應的 位置置一 這個bit序列通常很長,但是比起記住所有元素它占用的空間是小的 在判斷乙個元素時候已存在的時候,它會把...

Bloom Filter 布隆演算法

日常生活中,包括在設計計算機軟體時,我們經常要判斷乙個元素是否在乙個集合中。比如在字處理軟體中,需要檢查乙個英語單詞是否拼寫正確 也就是要判斷它是否在已知的字典中 在 fbi,乙個嫌疑人的名字是否已經在嫌疑名單上 在網路爬蟲裡,乙個 是否被訪問過等等。最直接的方法就是將集合中全部的元素存在計算機中,...

例項學習Bloom Filter

0.科普 1.為什麼需要bloom filter 2.基本原理 3.如何設計bloom filter 4.例項操作 5.擴充套件 0.科普 bloom filter是由bloom在1970年提出的一種多雜湊函式對映的快速查詢演算法。通常應用在一些需要快速判斷某個元素是否屬於集合,但是並不嚴格要求10...