布隆过滤器

“test.cpp”

<strong><span style="font-size:18px;">#include <iostream>
using namespace std;
#include "BloomFilter.h"
#include <string>

void test()
{
	char* str1 = "1ile:///C:/Users/xjh/AppData/Local/Temp/360zip$Temp/360$0/%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%93%88%E5%B8%8C%E7%AE%97%E6%B3%95/%E5%90%84%E7%A7%8D%E5%AD%97%E7%AC%A6%E4%B8%B2Hash%E5%87%BD%E6%95%B0%20-%20clq%20-%20%E5%8D%9A%E5%AE%A2%E5%9B%AD.html";
	char* str2 = "2ile:///C:/Users/xjh/AppData/Local/Temp/360zip$Temp/360$0/%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%93%88%E5%B8%8C%E7%AE%97%E6%B3%95/%E5%90%84%E7%A7%8D%E5%AD%97%E7%AC%A6%E4%B8%B2Hash%E5%87%BD%E6%95%B0%20-%20clq%20-%20%E5%8D%9A%E5%AE%A2%E5%9B%AD.html";
	char* str3 = "3ile:///C:/Users/xjh/AppData/Local/Temp/360zip$Temp/360$0/%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%93%88%E5%B8%8C%E7%AE%97%E6%B3%95/%E5%90%84%E7%A7%8D%E5%AD%97%E7%AC%A6%E4%B8%B2Hash%E5%87%BD%E6%95%B0%20-%20clq%20-%20%E5%8D%9A%E5%AE%A2%E5%9B%AD.html";
	char* str4 = "4ile:///C:/Users/xjh/AppData/Local/Temp/360zip$Temp/360$0/%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%93%88%E5%B8%8C%E7%AE%97%E6%B3%95/%E5%90%84%E7%A7%8D%E5%AD%97%E7%AC%A6%E4%B8%B2Hash%E5%87%BD%E6%95%B0%20-%20clq%20-%20%E5%8D%9A%E5%AE%A2%E5%9B%AD.html";
	
	BloomFiter<> bf(5);
	bf.SetBloom(str1);
	bf.SetBloom(str2);
	bf.SetBloom(str3);
	cout<<bf.TestBloom(str1)<<endl;
	cout<<bf.TestBloom(str2)<<endl;
	cout<<bf.TestBloom(str3)<<endl;
	cout<<bf.TestBloom(str4)<<endl;
}
int main()
{
	test();
	system("pause");
	return 0;
}</span></strong>
“BitMap.h”

<strong><span style="font-size:18px;">#pragma once
#include<vector>

class BitMap
{
public:
	//range 范围
	BitMap(size_t range)
	{
		//size_t有四个字节,每个字节有八个位
		//右移5相当于除以32
		_bitmap.resize((range>>5) + 1);
	}

	void Set(size_t x)//0->1
	{
		//先求出在第几个数上
		size_t index = x/32;//相当于x>>5

		//在求出在第几个位上
		size_t num = x%32;

		_bitmap[index] |= (1<<num);
	}

	void Reset(size_t x)//1->0
	{
		size_t index = x/32;
		size_t num = x%32;

		_bitmap[index] &= (~(1<< num));
	}

	bool Test(size_t x)//x存在与否
	{
		size_t index = x/32;
		size_t num = x%32;

		int ret = _bitmap[index] & (1<<num);

		if (ret)
		{
			return true;
		}
		else
			return false;
	}
private:
	vector<size_t> _bitmap;	
};</span></strong>
“BloomFlter.h”

<strong><span style="font-size:18px;">#pragma  once
#include "BitMap.h"


struct _HashFunc1
{
	size_t BKDRHash(const char* str)  
	{  
		register size_t hash = 0;  
		while (size_t ch = (size_t)*str++)  
		{         
			hash = hash * 131 + ch;   // 也可以乘以31、131、1313、13131、131313..         
		}  
		return hash;  
	}  
	size_t operator()(const string& str)
	{
		return BKDRHash(str.c_str());
	}
};

struct _HashFunc2
{
	size_t SDBMHash(const char *str)  
	{  
		register size_t hash = 0;  
		while (size_t ch = (size_t)*str++)  
		{  
			hash = 65599 * hash + ch;         
			//hash = (size_t)ch + (hash << 6) + (hash << 16) - hash;  
		}  
		return hash;  
	}  
	size_t operator()(const string& str)
	{
		return SDBMHash(str.c_str());
	}
};

struct _HashFunc3
{
	size_t RSHash(const char *str)  
	{  
		register size_t hash = 0;  
		size_t magic = 63689;     
		while (size_t ch = (size_t)*str++)  
		{  
			hash = hash * magic + ch;  
			magic *= 378551;  
		}  
		return hash;  
	}  
	size_t operator()(const string& str)
	{
		return RSHash(str.c_str());
	}
};
 
struct _HashFunc4
{
	size_t APHash(const char *str)  
	{  
		register size_t hash = 0;  
		size_t ch;  
		for (long i = 0; ch = (size_t)*str++; i++)  
		{  
			if ((i & 1) == 0)  
			{  
				hash ^= ((hash << 7) ^ ch ^ (hash >> 3));  
			}  
			else  
			{  
				hash ^= (~((hash << 11) ^ ch ^ (hash >> 5)));  
			}  
		}  
		return hash;  
	}  
	size_t operator()(const string& str)
	{
		return APHash(str.c_str());
	}
};


struct _HashFunc5
{
	size_t JSHash(const char *str)  
	{  
		if(!*str)        // 这是由本人添加,以保证空字符串返回哈希值0  
			return 0;  
		register size_t hash = 1315423911;  
		while (size_t ch = (size_t)*str++)  
		{  
			hash ^= ((hash << 5) + ch + (hash >> 2));  
		}  
		return hash;  
	}  
	size_t operator()(const string& str)
	{
		return JSHash(str.c_str());
	}
};

template<class K = string,
class HashFunc1 = _HashFunc1,
class HashFunc2 = _HashFunc2,
class HashFunc3 = _HashFunc3,
class HashFunc4 = _HashFunc4,
class HashFunc5 = _HashFunc5
>
class BloomFiter
{
public:
	BloomFiter(int num)
		:_map(num * 5)
		,_range(num * 5)
	{}
	void SetBloom(const K& key)
	{
		//映射五个位置,将五个位置全都置成1

		size_t Hash1 = HashFunc1()(key) % _range;
		_map.Set(Hash1);

		size_t Hash2 = HashFunc2()(key) % _range;
		_map.Set(Hash2);

		size_t Hash3 = HashFunc3()(key) % _range;
		_map.Set(Hash3);

		size_t Hash4 = HashFunc4()(key) % _range;
		_map.Set(Hash4);

		size_t Hash5 = HashFunc5()(key) % _range;
		_map.Set(Hash5);

		cout<<Hash1<<" ";
		cout<<Hash2<<" ";
		cout<<Hash3<<" ";
		cout<<Hash4<<" ";
		cout<<Hash5<<endl;;
	}
	bool TestBloom(const K& key)
	{
		HashFunc1 hf1;
		if (_map.Test(hf1(key) % _range) == false)
		{
			return false;
		}
		HashFunc2 hf2;
		if (_map.Test(hf2(key) % _range) == false)
		{
			return false;
		}
		HashFunc3 hf3;
		if (_map.Test(hf3(key) % _range) == false)
		{
			return false;
		}
		HashFunc4 hf4;
		if (_map.Test(hf4(key) % _range) == false)
		{
			return false;
		}
		HashFunc5 hf5;
		if (_map.Test(hf5(key) % _range) == false)
		{
			return false;
		}

		return true;
	}
private:
	BitMap _map;
	size_t _range;
};</span></strong>




你可能感兴趣的:(布隆过滤器)