📄 bloomfilter.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 + -