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实现将英文单词表示的数字转换成阿拉伯数字的方法
Jul 02 Python
python实现list元素按关键字相加减的方法示例
Jun 09 Python
python脚本作为Windows服务启动代码详解
Feb 11 Python
numpy.linspace 生成等差数组的方法
Jul 02 Python
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
Jul 27 Python
对python当中不在本路径的py文件的引用详解
Dec 15 Python
python游戏地图最短路径求解
Jan 16 Python
python读取大文件越来越慢的原因与解决
Aug 08 Python
解析PyCharm Python运行权限问题
Jan 08 Python
Python底层封装实现方法详解
Jan 22 Python
解决pyqt5异常退出无提示信息的问题
Apr 08 Python
Linux系统下升级pip的完整步骤
Jan 31 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笔记之常用文件操作
2010/10/12 PHP
php实现mysql数据库操作类分享
2014/02/14 PHP
ThinkPHP令牌验证实例
2014/06/18 PHP
PHP生成数组再传给js的方法
2014/08/07 PHP
php实现微信公众平台账号自定义菜单类
2014/12/02 PHP
php实现按天数、星期、月份查询的搜索框
2016/05/02 PHP
php反射类ReflectionClass用法分析
2016/05/12 PHP
Highslide.js是一款基于js实现的网页中图片展示插件
2020/03/30 Javascript
js淡入淡出焦点图幻灯片效果代码分享
2015/09/08 Javascript
jquery插件jquery.dragscale.js实现拖拽改变元素大小的方法(附demo源码下载)
2016/02/25 Javascript
深入理解$.each和$(selector).each
2016/05/15 Javascript
浅谈JS中的三种字符串连接方式及其性能比较
2016/09/02 Javascript
使用vue实现grid-layout功能实例代码
2018/01/05 Javascript
详解vue-meta如何让你更优雅的管理头部标签
2018/01/18 Javascript
swiper 解决动态加载数据滑动失效的问题
2018/02/26 Javascript
解决Vue在封装了Axios后手动刷新页面拦截器无效的问题
2018/11/08 Javascript
微信小程序实现评论功能
2018/11/28 Javascript
使用异步组件优化Vue应用程序的性能
2019/04/28 Javascript
koa2的中间件功能及应用示例
2020/03/05 Javascript
Python中encode()方法的使用简介
2015/05/18 Python
Python 获取当前所在目录的方法详解
2017/08/02 Python
python读取文本绘制动态速度曲线
2018/06/21 Python
Python实现的tcp端口检测操作示例
2018/07/24 Python
python高效过滤出文件夹下指定文件名结尾的文件实例
2018/10/21 Python
Pandas统计重复的列里面的值方法
2019/01/30 Python
Python利用Faiss库实现ANN近邻搜索的方法详解
2020/08/03 Python
Python JSON常用编解码方法代码实例
2020/09/05 Python
PHP如何去执行一个SQL语句
2016/03/05 面试题
一套SQL笔试题
2016/08/14 面试题
经典优秀毕业生求职信范文分享
2013/12/18 职场文书
人力资源管理求职信
2014/08/07 职场文书
2014年学生会生活部工作总结
2014/11/07 职场文书
商务考察邀请函模板
2015/02/02 职场文书
环保守法证明
2015/06/24 职场文书
golang判断key是否在map中的代码
2021/04/24 Golang
vue使用Google Recaptcha验证的实现示例
2021/08/23 Vue.js