python使用布隆過濾器的實(shí)現(xiàn)示例
使用庫pybloom_live
from pybloom_live import ScalableBloomFilter,BloomFilter
# 可自動(dòng)伸縮的布隆過濾器
bloom = ScalableBloomFilter(initial_capacity=100,error_rate=0.001)
# 添加內(nèi)容
bloom.add('daqi')
print('daqi'in bloom)
# 定長的布隆過濾器
bloom1 = BloomFilter(capacity=10000)
bloom1.add('daqi')
print('daqi'in bloom1)
手動(dòng)實(shí)現(xiàn)一個(gè)簡單的布隆過濾器
使用bitarray實(shí)現(xiàn),將初始數(shù)組置為0,根據(jù)hash計(jì)算出節(jié)點(diǎn)置為1,同時(shí)寫了一個(gè)生成隨機(jī)碼的函數(shù)用于測試。
import random
import mmh3
from bitarray import bitarray
import os.path
import re
# bitarray長度
BIT_SIZE = 50000
class BloomFilter():
def __init__(self):
bit_array = bitarray(BIT_SIZE)
bit_array.setall(0)
self.bit_array = bit_array
self.bit_size = self.length()
def get_points(self, url):
"""
生成需要插入的位置
:param url:
:return:節(jié)點(diǎn)的列表
"""
point_list = []
for i in range(7):
point = mmh3.hash(url,30+i) % self.bit_size
point_list.append(point)
return point_list
def add(self, url):
"""
添加url到bitarray中
:param url:
:return:
"""
res = self.bitarray_expand()
points = self.get_points(url)
try:
for point in points:
self.bit_array[point] = 1
return '注冊(cè)完成!'
except Exception as e:
return e
def contains(self,url):
"""
驗(yàn)證url是否存在
:param url:
:return:True or False
"""
points = self.get_points(url)
# 在bitarray中查找對(duì)應(yīng)的點(diǎn),如果有一個(gè)點(diǎn)值為0就說明該url不存在
for p in points:
if self.bit_array[p] == 0:
return False
return True
def count(self):
"""
獲取bitarrray中使用的節(jié)點(diǎn)數(shù)
:return: bitarray長度
"""
return self.bit_array.count()
def length(self):
"""
獲取bitarray的長度
:return:bitarray的長度
"""
return len(self.bit_array)
def bitarray_expand(self):
"""
擴(kuò)充bitarray長度
:return:bitarray的長度或使用率,布隆過濾器的bitarray的使用最好不要超過50%,這樣誤判率低一些
"""
isusespace = round(int(self.count()) / int(self.length()),4)
if 0.50 < isusespace:
# 新建bitarray
expand_bitarray = bitarray(BIT_SIZE)
expand_bitarray.setall(0)
# 增加新建的bitarray
self.bit_array = self.bit_array + expand_bitarray
self.bit_size = self.length()
return self.bit_size
else:
return f'長度尚可,{round(isusespace * 100,2)}%'
def get_captcha():
"""
生成用于測試的隨機(jī)碼
:return:
"""
seed = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
captcha = ""
for i in range(10):
captcha += random.choice(seed)
print(captcha)
return captcha
if __name__ == '__main__':
bloom = BloomFilter()
for i in range(100000):
bloom.add(f'www.{get_captcha()}.com')
print(bloom.length())
print(bloom.count())
print(bloom.count())
到此這篇關(guān)于python使用布隆過濾器的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)python 布隆過濾器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)掃描局域網(wǎng)活動(dòng)ip(掃描在線電腦)
這篇文章主要介紹了Python實(shí)現(xiàn)掃描局域網(wǎng)活動(dòng)ip(掃描在線電腦),本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-04-04
使用python實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲
這篇文章主要為大家詳細(xì)介紹了使用python實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03
詳解appium+python 啟動(dòng)一個(gè)app步驟
這篇文章主要介紹了詳解appium+python 啟動(dòng)一個(gè)app步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12
AI生成圖片Stable?Diffusion環(huán)境搭建與運(yùn)行方法
Stable?Diffusion是一種基于擴(kuò)散過程的生成模型,由Ge?et?al.在2021年提出,該模型利用了隨機(jī)變量的穩(wěn)定分布,通過遞歸地應(yīng)用擴(kuò)散過程來生成高質(zhì)量的圖像,這篇文章主要介紹了AI圖片生成Stable?Diffusion環(huán)境搭建與運(yùn)行,需要的朋友可以參考下2023-05-05
Python使用pyglet庫完整實(shí)現(xiàn)漢諾塔游戲流程詳解
這篇文章主要介紹了Python使用pyglet庫完整實(shí)現(xiàn)漢諾塔游戲流程,漢諾塔問題是一個(gè)遞歸問題,也可以使用非遞歸法來解決,這個(gè)問題不僅是一個(gè)數(shù)學(xué)和邏輯問題,也是一個(gè)很好的教學(xué)工具,可以用來教授遞歸、算法和邏輯思考等概念,需要的朋友可以參考下2007-02-02
基于Linux系統(tǒng)中python matplotlib畫圖的中文顯示問題的解決方法
下面小編就為大家?guī)硪黄贚inux系統(tǒng)中python matplotlib畫圖的中文顯示問題的解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06
使用PyCharm調(diào)試程序?qū)崿F(xiàn)過程
這篇文章主要介紹了使用PyCharm調(diào)試程序?qū)崿F(xiàn)過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

