⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bloomfilter.cpp

📁 概述:数据的纵向收集
💻 CPP
字号:
#include "stdafx.h"
#include "BloomFilter.h"
#include "Md5.h"

//////////////////////////////////////////////////////////////////////////
CBloomFilter* CBloomFilter::s_pBloom = NULL;

//////////////////////////////////////////////////////////////////////////
CBloomFilter::CBloomFilter()
{
	for (int i=0;i<_BITMAP_COUNT_;i++)
	{
		m_BitMap[i] = new BYTE[_BITMAP_LENGTH_>>3];
		memset(m_BitMap[i],0,_BITMAP_LENGTH_>>3);
	}
}

CBloomFilter::~CBloomFilter()
{
	for (int i=0;i<_BITMAP_COUNT_;i++)
	{
		delete[] m_BitMap[i];
	}

	s_pBloom = NULL;
}

CBloomFilter* CBloomFilter::Instance()
{
	if(s_pBloom==NULL)
	{
		//build & proxy pattern
		s_pBloom = new CBloomFilter();
	}
	return s_pBloom;
}

void CBloomFilter::Release()
{
	if (s_pBloom!=NULL)
	{
		delete s_pBloom;
	}
	s_pBloom=NULL;
}

bool CBloomFilter::find(LPCSTR lpszUrl)
{
	bool bResult = true;
	DWORD signMD5[_BITMAP_COUNT_];

	CMD5 md5;
	md5.GenerateMD5((unsigned char*)lpszUrl,f_strlen(lpszUrl));
	signMD5[0]=md5.m_data[0];
	signMD5[1]=md5.m_data[1];
	signMD5[2]=md5.m_data[2];
	signMD5[3]=md5.m_data[3];

	for(int i=1;i<_BITMAP_COUNT_>>2;i++)
	{
		md5.GenerateMD5((unsigned char*)&signMD5[(i-1)*4],16);
		signMD5[4*i]=md5.m_data[0];
		signMD5[4*i+1]=md5.m_data[1];
		signMD5[4*i+2]=md5.m_data[2];
		signMD5[4*i+3]=md5.m_data[3];
	}
	
	m_lock.ReadLock();
	for(int i=0;i<_BITMAP_COUNT_;i++)
	{
		if(!DoCheckBitmap(m_BitMap[i],_BITMAP_LENGTH_,signMD5[i]%_BITMAP_LENGTH_))
		{
			bResult=false;
			break;
		}
	}
	m_lock.ReadUnlock();

	return bResult;
}

void CBloomFilter::insert(LPCSTR lpszUrl)
{
	DWORD signMD5[_BITMAP_COUNT_];

	CMD5 md5;
	md5.GenerateMD5((unsigned char*)lpszUrl,f_strlen(lpszUrl));
	signMD5[0]=md5.m_data[0];
	signMD5[1]=md5.m_data[1];
	signMD5[2]=md5.m_data[2];
	signMD5[3]=md5.m_data[3];

	for(int i=1;i<_BITMAP_COUNT_>>2;i++)
	{
		md5.GenerateMD5((unsigned char*)&signMD5[(i-1)*4],16);
		signMD5[4*i]=md5.m_data[0];
		signMD5[4*i+1]=md5.m_data[1];
		signMD5[4*i+2]=md5.m_data[2];
		signMD5[4*i+3]=md5.m_data[3];
	}

	m_lock.WriteLock();
	for(int i=0;i<_BITMAP_COUNT_;i++)
	{
		DoSetBitmap(m_BitMap[i],_BITMAP_LENGTH_,signMD5[i]%_BITMAP_LENGTH_);
	}
	m_lock.WriteUnlock();
}

void CBloomFilter::clear()
{
	m_lock.WriteLock();

	for (int i=0;i<_BITMAP_COUNT_;i++)
	{
		memset(m_BitMap[i],0,_BITMAP_LENGTH_>>3);
	}
	
	m_lock.WriteUnlock();
}

bool CBloomFilter::DoCheckBitmap(BYTE* bitmap,int len,int offset)
{
	int _pos = offset>>3;
	int _offset = offset%8;
	return ((bitmap[_pos] & (1<<_offset))!=0);
}

void CBloomFilter::DoSetBitmap(BYTE* bitmap,int len,int offset)
{
	int _pos = offset>>3;
	int _offset = offset%8;
	bitmap[_pos] = (bitmap[_pos] | (1<<_offset));
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -