基於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...