加入收藏 | 设为首页 | 会员中心 | 我要投稿 天瑞地安资讯网_瑞安站长网 (https://www.ruian888.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php 实现布隆过滤

发布时间:2022-10-11 15:17:29 所属栏目:PHP教程 来源:
导读:  python使用布隆过滤器如何实现 python使用布隆过滤器实现代码示例

  python使用布隆过滤器如何实现?本篇文章小编给大家分享一下python使用布隆过滤器实现代码示例,小编觉得挺不错的,现在分享给大家供

  python使用布隆过滤器如何实现 python使用布隆过滤器实现代码示例
 
  python使用布隆过滤器如何实现?本篇文章小编给大家分享一下python使用布隆过滤器实现代码示例,小编觉得挺不错的,现在分享给大家供大家参考PHP过滤器,有需要的小伙伴们可以来看看。
 
  使用库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'{get_captcha()}.com')
 
  print(bloom.length())
 
  print(bloom.count())
 
  print(bloom.count())
 

(编辑:天瑞地安资讯网_瑞安站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!