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获取url的返回信息方法
Dec 17 Python
Python嵌套式数据结构实例浅析
Mar 05 Python
django数据关系一对多、多对多模型、自关联的建立
Jul 24 Python
Python定时发送天气预报邮件代码实例
Sep 09 Python
Python3.8对可迭代解包的改进及用法详解
Oct 15 Python
python hashlib加密实现代码
Oct 17 Python
基于python操作ES实例详解
Nov 16 Python
jupyter notebook运行命令显示[*](解决办法)
May 18 Python
python安装读取grib库总结(推荐)
Jun 24 Python
ITK 实现多张图像转成单个nii.gz或mha文件案例
Jul 01 Python
Python RabbitMQ实现简单的进程间通信示例
Jul 02 Python
python图片合成的示例
Nov 09 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
phpMyadmin 用户权限中英对照
2010/04/02 PHP
PHP模块memcached使用指南
2014/12/08 PHP
parseInt parseFloat js字符串转换数字
2010/08/01 Javascript
电子商务网站上的常用的js放大镜效果
2011/12/08 Javascript
js Math 对象的方法
2013/09/01 Javascript
JS文本获得焦点清除文本文字的示例代码
2014/01/13 Javascript
js语法学习之判断一个对象是否为数组
2014/05/13 Javascript
js设置cookie过期当前时间减去一秒相当于立即过期
2014/09/04 Javascript
JS实现从顶部下拉显示的带动画QQ客服特效代码
2015/10/24 Javascript
JS文件上传神器bootstrap fileinput详解
2021/01/28 Javascript
原生JS实现不断变化的标签
2017/05/22 Javascript
nodejs中安装ghost出错的原因及解决方法
2017/10/23 NodeJs
React中的refs的使用教程
2018/02/13 Javascript
讲解vue-router之什么是动态路由
2018/05/28 Javascript
vue-cli 3.x配置跨域代理的实现方法
2019/04/12 Javascript
Vue render函数实战之实现tabs选项卡组件
2019/04/22 Javascript
基于Proxy的小程序状态管理实现
2019/06/14 Javascript
JavaScript使用canvas绘制随机验证码
2020/02/17 Javascript
利用原生JS实现欢乐水果机小游戏
2020/04/23 Javascript
使用npm命令提示: 'npm' 不是内部或外部命令,也不是可运行的程序的处理方法
2020/05/14 Javascript
python实现媒体播放器功能
2018/02/11 Python
Python字典循环添加一键多值的用法实例
2019/01/20 Python
Python中IP地址处理IPy模块的方法
2019/08/16 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
香港交友网站:be2香港
2018/07/22 全球购物
SQL中where和having的区别
2012/06/17 面试题
大学生求职简历的自我评价
2013/10/21 职场文书
岗位说明书范文
2014/05/07 职场文书
2014最新房贷收入证明范本
2014/09/12 职场文书
水利专业大学生职业生涯规划书范文
2014/09/17 职场文书
中学生自我评价2015
2015/03/03 职场文书
幼儿园心得体会范文
2016/01/21 职场文书
2017新年晚会开幕词
2016/03/03 职场文书
创业计划书之外语培训班
2019/11/02 职场文书
Mysql 设置boolean类型的操作
2021/06/04 MySQL
Python实现文字pdf转换图片pdf效果
2022/04/03 Python