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列表推导式的使用方法
Nov 21 Python
python采用requests库模拟登录和抓取数据的简单示例
Jul 05 Python
Python二分查找详解
Sep 13 Python
python去除文件中空格、Tab及回车的方法
Apr 12 Python
解决Linux系统中python matplotlib画图的中文显示问题
Jun 15 Python
在python中利用最小二乘拟合二次抛物线函数的方法
Dec 29 Python
Python使用ctypes调用C/C++的方法
Jan 29 Python
python初学者,用python实现基本的学生管理系统(python3)代码实例
Apr 10 Python
python异步实现定时任务和周期任务的方法
Jun 29 Python
pandas实现to_sql将DataFrame保存到数据库中
Jul 03 Python
python关于变量名的基础知识点
Mar 03 Python
Pytho爬虫中Requests设置请求头Headers的方法
Sep 22 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数据库类
2009/05/27 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
2014/12/15 PHP
Zend Framework入门教程之Zend_Mail用法示例
2016/12/08 PHP
js 多浏览器分别判断代码
2010/04/01 Javascript
javascript实现动态侧边栏代码
2014/02/19 Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
2014/12/18 Javascript
jQuery实现3D文字特效的方法
2015/03/10 Javascript
JavaScript 面向对象与原型
2015/04/10 Javascript
JavaScript中解析JSON数据的三种方法
2015/07/03 Javascript
canvas时钟效果
2017/02/16 Javascript
javascript 缓冲运动框架的实现
2017/09/29 Javascript
node+express框架中连接使用mysql(经验总结)
2018/11/10 Javascript
推荐一个基于Node.js的表单验证库
2019/02/15 Javascript
Easyui 关闭jquery-easui tab标签页前触发事件的解决方法
2019/04/28 jQuery
在vue中把含有html标签转为html渲染页面的实例
2019/10/28 Javascript
基于canvasJS在PHP中制作动态图表
2020/05/30 Javascript
比较详细Python正则表达式操作指南(re使用)
2008/09/06 Python
利用python写个下载teahour音频的小脚本
2017/05/08 Python
Python 快速实现CLI 应用程序的脚手架
2017/12/05 Python
python实现批量解析邮件并下载附件
2018/06/19 Python
Django 连接sql server数据库的方法
2018/06/30 Python
Python中new方法的详解
2019/01/15 Python
itchat-python搭建微信机器人(附示例)
2019/06/11 Python
numpy.transpose()实现数组的转置例子
2019/12/02 Python
PyTorch中permute的用法详解
2019/12/30 Python
matplotlib bar()实现百分比堆积柱状图
2021/02/24 Python
实习老师个人总结的自我评价
2013/09/28 职场文书
电钳专业个人求职信
2014/01/04 职场文书
采购部经理岗位职责
2014/02/10 职场文书
学生安全承诺书
2014/05/22 职场文书
就业协议书
2014/09/12 职场文书
调任通知
2015/04/21 职场文书
2016个人廉洁自律承诺书
2016/03/25 职场文书
干货:我将这样书写我的演讲稿!
2019/05/09 职场文书
56句经典英文座右铭
2019/08/09 职场文书
分析SQL窗口函数之取值窗口函数
2022/04/21 Oracle