python使用布隆过滤器的实现示例


Posted in Python onAugust 20, 2020

使用库pybloom_live

from pybloom_live import ScalableBloomFilter,BloomFilter

# 可自动伸缩的布隆过滤器
bloom = ScalableBloomFilter(initial_capacity=100,error_rate=0.001)

# 添加内容
bloom.add('daqi')
print('daqi'in bloom)

# 定长的布隆过滤器
bloom1 = BloomFilter(capacity=10000)
bloom1.add('daqi')
print('daqi'in bloom1)

手动实现一个简单的布隆过滤器

使用bitarray实现,将初始数组置为0,根据hash计算出节点置为1,同时写了一个生成随机码的函数用于测试。

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:节点的列表
    """
    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 '注册完成!'
    except Exception as e:
      return e

  def contains(self,url):
    """
    验证url是否存在
    :param url:
    :return:True or False
    """
    points = self.get_points(url)
    # 在bitarray中查找对应的点,如果有一个点值为0就说明该url不存在
    for p in points:
      if self.bit_array[p] == 0:
        return False
    return True


  def count(self):
    """
    获取bitarrray中使用的节点数
    :return: bitarray长度
    """
    return self.bit_array.count()


  def length(self):
    """
    获取bitarray的长度
    :return:bitarray的长度
    """
    return len(self.bit_array)


  def bitarray_expand(self):
    """
    扩充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():
  """
  生成用于测试的随机码
  :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())

到此这篇关于python使用布隆过滤器的实现示例的文章就介绍到这了,更多相关python 布隆过滤器内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python编程django实现同一个ip十分钟内只能注册一次
Nov 03 Python
django初始化数据库的实例
May 27 Python
Flask实现跨域请求的处理方法
Sep 27 Python
python中将zip压缩包转为gz.tar的方法
Oct 18 Python
Python中作用域的深入讲解
Dec 10 Python
python实现QQ空间自动点赞功能
Apr 09 Python
Python数据类型之Number数字操作实例详解
May 08 Python
[机器视觉]使用python自动识别验证码详解
May 16 Python
python递归下载文件夹下所有文件
Aug 31 Python
使用python和pygame制作挡板弹球游戏
Dec 03 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
May 28 Python
Pycharm在指定目录下生成文件和删除文件的实现
Dec 28 Python
QT5 Designer 打不开的问题及解决方法
Aug 20 #Python
Python配置pip国内镜像源的实现
Aug 20 #Python
Python使用lambda抛出异常实现方法解析
Aug 20 #Python
浅谈对python中if、elif、else的误解
Aug 20 #Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
Aug 20 #Python
Python自动化测试中yaml文件读取操作
Aug 20 #Python
通过代码实例解析Pytest运行流程
Aug 20 #Python
You might like
详细解读PHP中接口的应用
2015/08/12 PHP
Javascript 面向对象特性
2009/12/28 Javascript
javascript下string.format函数补充
2010/08/24 Javascript
angularJS 中$scope方法使用指南
2015/02/09 Javascript
Js和JQuery获取鼠标指针坐标的实现代码分享
2015/05/25 Javascript
纯css实现窗户玻璃雨滴逼真效果
2015/08/23 Javascript
jQuery检测滚动条是否到达底部
2015/12/15 Javascript
Node.js的Koa框架上手及MySQL操作指南
2016/06/13 Javascript
jQuery实现简单的tab标签页效果
2016/09/12 Javascript
Bootstrap Table表格一直加载(load)不了数据的快速解决方法
2016/09/17 Javascript
Javascript中常见的逻辑题和解决方法
2016/09/17 Javascript
jQuery.datatables.js插件用法及api实例详解
2016/10/28 Javascript
vue几个常用跨域处理方式介绍
2018/02/07 Javascript
玩转Koa之核心原理分析
2018/12/29 Javascript
小白教程|一小时上手最流行的前端框架vue(推荐)
2019/04/10 Javascript
Vue多环境代理配置方法思路详解
2019/06/21 Javascript
浅析js实现网页截图的两种方式
2019/11/01 Javascript
JavaScript字符串处理常见操作方法小结
2019/11/15 Javascript
javascript设计模式 ? 备忘录模式原理与用法实例分析
2020/04/21 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
2020/10/24 Javascript
[01:54]胎教DOTA2 准妈妈玩家现身中国区预选赛
2016/06/26 DOTA
[43:18]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
Python入门教程之if语句的用法
2015/05/14 Python
HTML5 drag和drop具体使用详解
2021/01/18 HTML / CSS
阿里健康大药房:阿里自营网上药店
2017/08/01 全球购物
一套Java笔试题
2016/08/20 面试题
工程力学专业毕业生求职信
2013/10/06 职场文书
关于工资低的辞职信
2014/01/14 职场文书
好军嫂事迹材料
2014/01/15 职场文书
政治思想表现评语
2014/05/04 职场文书
小学先进集体事迹材料
2014/05/31 职场文书
沙滩主题婚礼活动策划方案
2014/09/15 职场文书
护士个人总结范文
2015/02/13 职场文书
装饰技术负责人岗位职责
2015/04/13 职场文书
2015秋季幼儿园开学通知
2015/07/16 职场文书
Nginx HTTP跳转至HTTPS
2022/05/15 Servers