布隆过滤器

布隆过滤器

简介

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。

原理

简述原理

布隆过滤器其实是通过和位图类似的方式,位图用位来存储某个值在不在,布隆过滤器是通过多个位存储一个字符串或者文件名,当判断一个字符串是否存在时,通过三个值同时判断是否存在,这就导致了会出现误判,但是在概率上,这种误判率并不高。

图解原理

图中哈希函数均为虚构,只是为了表示字符串通过哈希可以对应三个值,并不是真实对应的值
布隆过滤器

代码

文中赋用了位图的函数,所以在此附上位图的下载链接
点此下载位图
点此下载布隆过滤器

#pragma once

#include "Bitmap.h"

typedef Bitmap BloomFilter;
typedef char* BloomFilterData;

void BloomFilterInit(BloomFilter* bf, size_t range);//初始化
size_t BloomFilterFunc1(BloomFilterData str);//哈希函数
size_t BloomFilterFunc2(BloomFilterData str);
size_t BloomFilterFunc3(BloomFilterData str);
void BloomFilterSet(BloomFilter* bf, BloomFilterData str);//插入某个字符串的存在信息
bool BloomFilterTest(BloomFilter* bf, BloomFilterData str);//检查某个字符串是否存在
void BloomFilterDestroy(BloomFilter* bf);//销毁

void TestBloomFilter();//测试用例

void BloomFilterInit(BloomFilter* bf, size_t range)
{
    assert(bf);
    BitmapInit(bf, range);//初始化布隆过滤器
}

size_t BloomFilterFunc1(BloomFilterData str)
{
    size_t seed = 131;
    register size_t hash = 0;
    while (*str)
    {
        hash = hash * seed + (*str++);
    }
    return (hash & 0x7FFFFFFF);
}

size_t BloomFilterFunc2(BloomFilterData str)
{
    register size_t hash = 0;
    size_t seed = 65599;
    while (*str)
    {
        hash = hash * seed + (*str++);
    }
    return hash;
}

size_t BloomFilterFunc3(BloomFilterData str)
{
    register size_t hash = 0;
    size_t seed = 63689;
    while (*str)
    {
        hash = hash * seed + (*str++);
    }
    return hash;
}

void BloomFilterSet(BloomFilter* bf, BloomFilterData str)
{
    assert(bf);
    //对三个位进行置1
    size_t index1 = BloomFilterFunc1(str);
    size_t index2 = BloomFilterFunc2(str);
    size_t index3 = BloomFilterFunc3(str);
    BitmapSet(bf, index1);
    BitmapSet(bf, index2);
    BitmapSet(bf, index3);
}

bool BloomFilterTest(BloomFilter* bf, BloomFilterData str)
{
    //判断某个字符串是否存在
    assert(bf);
    size_t index1 = BloomFilterFunc1(str);
    if (BitmapTest(bf, index1) == false)
    {
        return false;
    }
    size_t index2 = BloomFilterFunc2(str);
    if (BitmapTest(bf, index2) == false)
    {
        return false;
    }
    size_t index3 = BloomFilterFunc3(str);
    if (BitmapTest(bf, index3) == false)
    {
        return false;
    }
    return true;
}

void BloomFilterDestroy(BloomFilter* bf)
{
    assert(bf);
    BitmapDestroy(bf);
}

void TestBloomFilter()
{
    BloomFilter bf;
    char str1[] = "hello";
    char str2[] = "nice";
    char str3[] = "perfect";

    BloomFilterInit(&bf, 4200000000);
    BloomFilterSet(&bf, str1);
    BloomFilterSet(&bf, str2);
    BloomFilterSet(&bf, str3);
    printf("%d\n", BloomFilterTest(&bf, "hello"));
    printf("%d\n", BloomFilterTest(&bf, "perfect"));
    printf("%d\n", BloomFilterTest(&bf, "great"));

    BitmapDestroy(&bf);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值