布隆过滤器
简介
布隆过滤器(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);
}