bloom_filter算法的C++实现

算法学习 - Bloom Filter(布隆过滤器)学习实现(C++实现) Bloom filter简介 Bloom Filter计算方法 Bloom Filter优点缺点 优点 缺点 图示说明Bloom filter简介Bloom filter 是由 Howard Bloom 在 1970 年提出的二进制向量数据结构,它具有很好的空间和时间效率,被用来检测一个元素是不是集合中的一个成员。如果检测结果为是,该元素不一定在集合中;但如果检测结果为否,该元素一定不在集合中。因此 阅读详情
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

unsigned int jshash( const char *s , unsigned size);
unsigned int sdbmhash( const char *s , unsigned size);

/* ------------- bloom types and funcs --------------- */
const unsigned char masks [ 8 ] = { 0x01 , 0x02 , 0x04 , 0x08 , 0x10 , 0x20 , 0x40 , 0x80 };

typedef unsigned ( * hash_func_ptr)( const char * buffer , unsigned size);
struct __bloom_filter
{
    unsigned n;
    unsigned size;
    unsigned char * bits;
    hash_func_ptr hash;
};
typedef struct __bloom_filter * bloom_filter;

bloom_filter bloom_init ( unsigned n , hash_func_ptr hash);
int bloom_insert( bloom_filter b , void * data , unsigned size);
int bloom_check( bloom_filter b , void * data , unsigned size);
void bloom_destroy( bloom_filter b);
/* ------------- end of bloom types and funcs --------------- */

int main()
{
    const int size = 655371;
    bloom_filter b1 = bloom_init( size , sdbmhash);
    for ( int i = 0; i < size / 2; i += 2)
    {
        if ( ! bloom_insert( b1 , & i , sizeof( i)))
        {
            fprintf( stderr , "err insert %d /n " , i);
            exit( 1);
        }
    }
    printf( "insert ok /n ");

    int cnt = 0;
    for ( int i = 0; i < size / 2; i ++)
    {
        if ( bloom_check( b1 , & i , sizeof( i)))
        {
            if ( i & 1)
            {
                //printf("i = %d should not be checked, tolerable./n", i);
                cnt ++;
            }
        }
        else
        {
            if ( !( i & 1))
            {
                printf( "i = %d should be checked! BUG! /n " , i);
            }
        }
    }
    printf( "cnt = %d /n " , cnt);
    return 0;
}

bloom_filter bloom_init ( unsigned n , hash_func_ptr hash)
{
    bloom_filter b = ( bloom_filter) malloc( sizeof( __bloom_filter));
    if (b == NULL)
    {
        fprintf( stderr , "bloom_init: err malloc bloom_filter /n ");
        return NULL;
    }

    b ->n    = n;
    b -> size = (n + 7) / 8;
    b -> hash = hash;

    b -> bits = ( unsigned char *) malloc(b -> size);
    memset(b -> bits , 0 , b -> size);
    if (b -> bits == NULL)
    {
        fprintf( stderr , "bloom_init: err malloc bits /n ");
        return NULL;
    }
    return b;
}

int bloom_insert( bloom_filter b , void * data , unsigned size)
{
    unsigned h = b -> hash(( const char *) data , size) % (b ->n);
    unsigned idx = h / 8;
    if ( idx >= b -> size)
    {
        fprintf( stderr , "bloom_insert: hash value overflow /n ");
        return 0;
    }
    b -> bits [ idx ] |= masks [ h % 8 ];
    //printf("h = %2d, idx = %2d, bit = %2d/n", h, idx, h % 8);
    return 1;
}

int bloom_check( bloom_filter b , void * data , unsigned size)
{
    unsigned h = b -> hash(( const char *) data , size) % (b ->n);
    unsigned idx = h / 8;
    if ( idx >= b -> size)
    {
        fprintf( stderr , "bloom_insert: hash value overflow /n ");
        exit( 1);
    }
    return !!(b -> bits [ idx ] & masks [ h % 8 ]);
}

void bloom_destroy( bloom_filter b)
{
    if (b != NULL)
    {
        if (b -> bits != NULL)
            free(b -> bits);
        free(b);
    }
}

//-----------------------------------------------

unsigned int jshash( const char *s , unsigned size)
{
    int hash = 1315423911;
    unsigned len = 0;
    while ( len < size)
    {
        hash ^= ( hash << 5) + s [ len ] + ( hash >> 2);
        len ++;
    }
    return ( hash & 0x7fffffffl);
}

unsigned int sdbmhash( const char *s , unsigned size)
{
    int hash = 0;
    unsigned len = 0;
    while ( len < size)
    {
        hash = ( hash << 6) + ( hash << 16) - hash + s [ len ];
        len ++;
    }
    return ( hash & 0x7fffffffl);
}
简述 Bloom Filter,及它的使用场景是什么 Bloom Filter(布隆过滤器)是一种空间效率非常高的概率型数据结构,它可以判断一个元素是否在一个集合中。快速判断:可以以常数时间复杂度O(k)判断一个元素是否在集合中,其中k是哈希函数的数量。可能会误判:对于一个不在集合中的元素,Bloom Filter 可能误判它在集合中(即产生“假阳性”),但绝不会产生“假阴性”。不支持删除:标准的 Bloom Filter 只能添加元素,不能删除元素,但有一些扩展可以支持删除。 阅读详情

相关推荐

Bloom Filter 原理 及C++ 实现

布隆过滤器[1](Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的。 它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元素是否在一个集合中。 它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率(假正例False positives,即Bloom Filter报告某一元素存在于某集合中,但是实

在路上 的专栏 5178

Bloom Filter(布隆过滤器

转自:http://blog.csdn.net/hguisu/article/details/7866173 1. Bloom-Filter算法简介         Bloom-Filter,即布隆过滤器,1970年由Bloom中提出。它可以用于检索一个元素是否在一个集合中。        Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地

692

海量数据处理算法Bloom Filter

算法介绍 Bloom Filter的中文名称叫做布隆过滤器,因为他最早的提出者叫做布隆(Bloom),因而而得此名。布隆过滤器简单的说就是为了检索一个元素是否存在于某个集合当中,以此实现数据的过滤。也许你会想,这还不简单,判断元素是否存在某集合中,遍历集合,一个个去比较不就能得出结果,当然这没有任何的问题,但是当你面对的是海量数据的时候,在空间和时间上的代价是非常恐怖的,显然需要更好的办法来

走在前往架构师的路上 3762

C++】位图+布隆过滤器+哈希切分

本文介绍了两种处理海量数据的高效数据结构:位图和布隆过滤器。位图通过比特位表示数据存在状态,显著节省内存空间,适用于判断元素存在性问题,并详细讲解了位图的实现原理和代码实现。布隆过滤器通过多个哈希函数减少误判率,适用于字符串等复杂数据的快速查询。文章还探讨了哈希切分技术,通过分治思想处理超大规模数据文件。最后给出了多个典型应用场景的解决方案,如查找重复IP、文件交集等。这些技术在大数据处理中具有重要应用价值。

qjx的博客 645

c++实现Bloom Filter

Bloom Filter(BF) 是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法,用于快速查找某个元素是否属于集合, 但不要求百分百的准确率。 Bloom filter通常用于爬虫的url去重,即判断某个url是否已经被爬过。  为了说明Bloom Filter存在的重要意义,举一个实例:   假设要你写一个网络蜘蛛(web crawler)。由于网络间的链接

The Coding World 2339

Bloom Filter原理与实现

在做与Web爬虫有关的任务时,经常这样需要做这样的判断:对于新爬到的URL,我们需要判断这个新的URL是否已经在已有的URL集合中存在了。但是当已经存在的URL集合的数据量极其庞大时,这个存在性的判断工作就变得很有挑战性。 把这个问题抽象出来,就是说:现在需要一种算法(工具),帮助我们实现一种高效而准确的,元素针对集合的存在性判断。 为了解决上面说的这一类问题,人们从简入难,想出了很多办法:

guoziqing506的博客 3153

C++】BitSet和Bloom_Filter

C++位图布隆过滤器

A.的博客 2235

python判断目录是否为空效率_Python检测数据是否为空用什么方法

现在的实现是一个字典类型,拥有500万条数据,KEY是40位的Hash做的是从里面确定某个Hash是否存在,但是这样的方法内存占用太多了准备尝试bloomfilter替换但是感觉增加数据有点麻烦,是否有其他类似的算法可以用?==== 另一种介绍 ===每次拿到一个HASH在列表中寻找,如果有,则停止执行,如果没有,则将该HASH添加到列表,继续重复执行。问题在:内存/效率如果用bloomfilte...

weixin_29938187的博客 404

重删算法中的Bloom滤波器详解与C++实现

Bloom滤波器(Bloom Filter)是一种,用于快速判断某个元素是否存在于集合中。:可能出现,但:存储1亿元素仅需约114MB(0.1%误报率时):使用多个哈希函数降低冲突概率在数据去重(Deduplication)系统中,Bloom滤波器通常作为:将数据流切分为固定/可变大小块:对每个数据块生成唯一指纹(如SHA-1)若过滤器返回"不存在" → 直接存储新块若返回"可能存在" → 查询精确索引:确认为新块则存入存储系统并更新索引:减少90%以上的磁盘索引查询操作,显著提升吞吐量。

weixin_44727517的博客 1476

C++海量数据处理(二):布隆过滤器(Bloom Filter)详解

实例 、Bloom Filter算法描述 、Bloom Filter参数选择

ZY-JIMMY 1819

Bloom Filter算法及应用

1. 引言 问题:有1000瓶药,但是其中有一瓶是有毒的,小白鼠吃了24小时后就会死掉,请问,在24小时找出有毒的药物,最少需要多少只小白鼠? 答案是:10只,一只小白鼠可以表示2种状态,2^10可以表示1024种状态 分析可参考:http://lzj0470.iteye.com/blog/657579 通过二进制向量组来扩展描述的状态,Bloom Filter(BF)算法也是

Sin的专栏 967

哈希算法 位图 Bloom Filter

1、使用哈希算法进行数据分布,将数据分散存储在多个文件或多个机器上。通过合适地哈希函数,可以实现均匀地数据分布。2、将任意长度的二进制值串映射为固定长度地二进制值串,这个映射地规则就是哈希算法,而通过原始数据映射之后得到地二进制值串就是哈希值。1)从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法);2)对输入数据非常敏感,哪怕原始数据只修改了一个 bit ,最后得到的哈希值也大不相同;3)散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小;

2301_81259161的博客 773

大规模数据处理Bloom Filter C++代码实现

Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。 一. 实例    为了说明Bloom Filter存在的重要意义,举一个实例:   假设要你写一个网络蜘蛛(web crawler)。由于网络间的链接错综复杂,蜘蛛在网络间爬行很可能会形成“环”。为了避免形成“环”,就

Linux平台软件设计与开发 4227

海量数据处理——Bloom Filter C++代码实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一. 实例二. Bloom Filter算法(1) 加入字符串过程(2) 检查字符串是否存在的过程(3) 删除字符串过程三. Bloom Filter参数选择(1)哈希函数选择(2)Bit数组大小选择四. Bloom Filter实现代码 前言 Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。 一.

yuanmartin的博客 944

Bloom Filter算法实现

#include #include #include #include #include #include #include "hashFun.h.h" //#include //#include //#include /* * bloom.h * * Created on: 2012-2-22 * Author: xiaojay */ #ifndef BLOOM_H_ #de

ROSE的博客 653

Bloom Filter 原理及实现

题外话: 很久没写博客了,因为前一段时间过年在家放假,又因为自己保研了,所以一直比较闲。整个假期,基本都在准备毕业设计的相关内容。我毕业设计的方向是关于搜索引擎的,因此,期间阅读了大量相关论文。阅读了很多论文和技术书籍之后,我有几点感触。首先,发现国内很多论文或是书籍只是大量引述其他人的研究结果,自己的独特的见解非常少,一篇文章,70%的内容都是在以介绍为主,感觉发这样的论文是没有什么意...

weixin_30297281的博客 98

bloom filter与dawgdic(一种trie树)

恶意网址搜索与搜索热词提示

menggucaoyuan的专栏 2511
上一篇: 关于void* 用法以及调试
下一篇: Linux下程序的Profile工具
yanook
博客等级 码龄16年 54粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值