Bloom filter

 Bloom filter的实质就是位数组加多次哈希

优点:节省空间,快速
缺点:有一定误差率
适用范围:大容量数据检索
过程描述:对输入数据进行多次哈希,对相应位置1;判断是否存在时,应用同样的哈希函数检测相应位是否为1.
影响准确性的因素:
输入元素个数->n
位数组大小->m
哈系函数个数->k
误差率->e
k=(ln2)*(m/n)时e最小
m>=n*lg(1/e)时满足误差率最大为e,一般取m=1.44*n*lg(1/e)用以保证有足够的冗余0
简单实现(不包括哈希函数):
.h文件:
#ifndef __BLOOM_H__
#define __BLOOM_H__
//2011.06.17 by luna
//bloom filter
#include<stdlib.h>
 
typedef unsigned int (*hashfunc_t)(const char *);//哈希函数指针
typedef struct{
  size_t asize;//位数
  unsigned char *a;//位数组
  size_t nfuncs;//哈希函数书目
  hashfunc_t *funcs;//哈希函数指针
}BLOOM;//bloom过滤器结构
 
BLOOM *bloom_create(size_t size, size_t nfuncs, ...);
int bloom_destory(BLOOM *bloom);
int bloom_add(BLOOM *bloom, const char *s);
int bloom_check(BLOOM *bloom, const char *s);
 
#endif
.c文件:
#include<limits.h>
#include<stdarg.h>
 
#include"bloom.h"
//BIT array参见位数组实现
#define BITMASK(b) (1<<((b)%CHAR_BIT))
#define BITSLOT(b) ((b)/CHAR_BIT)
#define BITSET(a,b) ((a)[BITSLOT(b)] |= BITMASK(b))
#define BITCLEAR(a,b) ((a)[BITSLOT(b)] &= ~BITMASK(b))
#define BITTEST(a,b) ((a)[BITSLOT(b)] & BITMASK(b))
#define BITNSLOTS(nb) ((nb + CHAR_BIT - 1) / CHAR_BIT)
 
//create bloom array
//$begin bloom_create
BLOOM *bloom_create(size_t size, size_t nfuncs, ...)
{
  BLOOM *bloom;
  va_list l;
  int n;
  
  if(!(bloom = malloc(sizeof(BLOOM))))  return NULL;//分配bloom过滤器
  if(!(bloom->a = calloc(BITNSLOTS(size),sizeof(char))))//分配位数组
  {
    free(bloom);
    return NULL;
  }
  
  if(!(bloom->funcs = (hashfunc_t*)malloc(nfuncs*sizeof(hashfunc_t))))//分配哈希函数指针数组
  {
    free(bloom->a);
    free(bloom);
    return NULL;
  }
 
  va_start(l,nfuncs);//获取第一个可变参数地址
  for(n = 0; n < nfuncs; n++)//给哈希指针数组赋值
  {
    bloom->funcs[n] = va_arg(l,hashfunc_t);//获取下一个可变参数地址
  }
  va_end(l);//可变参数指针置0
 
  bloom->nfuncs = nfuncs;
  bloom->asize = size;
  
  return bloom;
 
}
//$end bloom_create
 
//destory bloom array
//$begin bloom_destory
int bloom_destory(BLOOM *bloom)
{
  free(bloom->a);
  free(bloom->funcs);
  free(bloom);
 
  return 0;
}
//$end bloom_destory
 
//add bloom array
//$begin bloom_add
int bloom_add(BLOOM *bloom, const char *s)
{
  size_t n;
  
  for(n = 0; n < bloom->nfuncs; n++)//多次哈希置位
  {
    BITSET(bloom->a, bloom->funcs[n](s) % bloom->asize);
  }
  
  return 0;
}
//$end bloom_add
 
//check the bloom array
//$begin bloom_check
int bloom_check(BLOOM *bloom, const char *s)
{
  size_t n;
  
  for(n = 0; n < bloom->nfuncs; n++)//多次哈希测位
  {
    if(!(BITTEST(bloom->a, bloom->funcs[n](s) % bloom->asize)))
    {
      return 0;
    }
  }
 
  return 1;
}
//$end bloom_check

转载于:https://www.cnblogs.com/ArthurSJiang/archive/2012/08/18/2645465.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Bloom filter是一种数据结构,它具有可压缩性和高效查询性,因此在分布式数据库、网络缓存、对等网和信息检索等领域引起了越来越多的研究者关注。Bloom filter可以判断一个元素是否存在于一个集合中,而且在判断结果中不会出现漏判的情况,即如果Bloom filter判断一个元素不存在,则该元素一定不存在;但是如果Bloom filter判断一个元素存在,则该元素可能不存在(即存在一定的误判率)。 Bloom filter的应用场景非常广泛。例如,可以使用Bloom filter来解决Redis缓存穿透问题、邮件黑名单过滤、爬虫网址过滤、新闻推荐过滤等。在数据库方面,一些数据库如HBase、RocksDB和LevelDB等内置了Bloom filter,用于判断数据是否存在,从而减少数据库的IO请求。 Bloom filter的原理是基于位数组和多个哈希函数。它使用一个位数组来表示集合,初始时所有的位都被置为0。当要向Bloom filter中插入一个元素时,会将该元素经过多个哈希函数得到多个哈希值,并将对应位置的位设置为1。当要查询一个元素是否存在于Bloom filter中时,同样会经过多个哈希函数得到多个哈希值,并检查对应位置的位是否都为1。如果所有的位都为1,则认为该元素可能存在于集合中;如果至少一个位为0,则该元素一定不存在于集合中。 因此,Bloom filter是一种高效的数据结构,可以用于判断一个元素是否存在于一个集合中。虽然Bloom filter存在一定的误判率,但可以通过调整参数来降低误判率,并且在很多应用场景下具有很高的效率和性能优势。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Bloom Filter研究进展](https://download.csdn.net/download/weixin_38522323/14847831)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [布隆(Bloom Filter)过滤器——全面讲解,建议收藏](https://blog.csdn.net/qq_41125219/article/details/119982158)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值