📄 hash.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "Hash.h"
#include "Stru.h"
Chash_v::Chash_v(int ibasecount,int itotcount)
{
int isize[2];
int icount[2];
m_ibasecount=ibasecount;
isize[0]=sizeof(TUnit_v);
isize[1]=0;
icount[0]=itotcount;
icount[1]=0;
m_theMem=new CMem();
m_theMem->init(icount,isize);
m_pbase=new (void *)[ibasecount];
for(int i=0;i<m_ibasecount;i++)
m_pbase[i]=NULL;
}
Chash_v::~Chash_v()
{
if(m_pbase)
delete m_pbase;
if(m_theMem)
delete m_theMem;
}
bool Chash_v::find(TUnit_v *paunit)
{
TUnit_v *punit;
int id=getPos(paunit->key);
//printf("in hash to find id=[%d] ",id);
id=id%m_ibasecount;
//printf("id=[%d] b=[%d]\n",id,m_pmemhash->m_ibasecount);
punit=(TUnit_v *)(m_pbase[id]);
if(punit==NULL)
{
//printf("is free head\n",id);
return false;
}
while(!(punit->key==paunit->key))
{
if(punit->pnext!=NULL)
{
punit=punit->pnext;
}
else
return false;
}
memcpy((char *)paunit,(char *)punit,sizeof(TUnit_v));
return true;
}
bool Chash_v::add(TUnit_v *paunit)
{
TUnit_v *punit;
time(&(paunit->ltime));
int id=getPos(paunit->key);
id=id%m_ibasecount;
//printf("id=[%d] basecount=[%d] \n",id,m_pmemhash->m_ibasecount);
punit=(TUnit_v *)(m_pbase[id]);
//printf("punit->ipne=[%d]",punit->ipnext);
if(punit==NULL)
{
char *pbuffer=m_theMem->maloc(sizeof(TUnit_v));
punit= (TUnit_v *)pbuffer;
memcpy((char *)punit,(char *)paunit,sizeof(TUnit_v));
punit->pnext=NULL;
m_pbase[id]=punit;
return true;
}
while(!(punit->key==paunit->key))
{
//printf("punit next=[%d]\n",punit->ipnext);
if(punit->pnext!=NULL)
{
punit=punit->pnext;
}
else
{
char *pbuffer=m_theMem->maloc(sizeof(TUnit_v));
if(pbuffer!=NULL)
{
memcpy(pbuffer,(char *)paunit,sizeof(TUnit_v));
((TUnit_v *)pbuffer)->pnext=NULL;
punit->pnext=(TUnit_v *)pbuffer;
return true;
}
else
return false;
}
}
//printf("hash node repeat info\n ");
return false;
}
bool Chash_v::remove(TUnit_v *paunit)
{
void *punit;
void **plast=NULL;
int id=getPos(paunit->key);
id=id%m_ibasecount;
punit=m_pbase[id];
if(punit==NULL)
return false;
plast=&(m_pbase[id]);
while(!( ((TUnit_v *)punit)->key==paunit->key) )
{
if(((TUnit_v *)punit)->pnext!=NULL)
{
plast=(void * *)&(((TUnit_v *)punit)->pnext);
punit=((TUnit_v *)punit)->pnext;
}
else
{
printf("not find the node\n");
return false;
}
}
assert(plast!=NULL);
*plast=((TUnit_v *)punit)->pnext;
m_theMem->free((char *)punit);
return true;
}
int Chash_v::clear(TUnit_v *punitout,int maxunit)
{
void **plast;
void *punit;
if(!timeout())
return 0;
printf("to clean timeout record\n");
time_t lntime;
time(&lntime);
int itot=0;
for(int i=0;i<m_ibasecount;i++)
{
punit=m_pbase[i];
plast=&(m_pbase[i]);
while(punit!=NULL)
{
if(lntime-((TUnit_v *)punit)->ltime>30)
{
memcpy(punitout,punit,sizeof(TUnit_v));
punitout++;
itot++;
printf("to clean [%d] record timeout\n",itot);
*plast=((TUnit_v *)punit)->pnext;
m_theMem->free((char *)punit);
punit=((TUnit_v *)punit)->pnext;
}
else
{
plast=(void * *)&(((TUnit_v *)punit)->pnext);
punit=((TUnit_v *)punit)->pnext;
}
if(itot>=maxunit)
return itot;
}
}
return itot;
}
void Chash_v::clearMem(CMem *ptheMem)
{
void **plast;
void *punit;
if(!timeout())
return;
printf("to clean timeout record\n");
time_t lntime;
time(&lntime);
int itot=0;
for(int i=0;i<m_ibasecount;i++)
{
punit=m_pbase[i];
plast=&(m_pbase[i]);
while(punit!=NULL)
{
if(lntime-((TUnit_v *)punit)->ltime>30)
{
itot++;
printf("to clean [%d] record timeout\n",itot);
*plast=((TUnit_v *)punit)->pnext;
ptheMem->free((char *)((TUnit_v *)punit)->pval);
m_theMem->free((char *)punit);
punit=((TUnit_v *)punit)->pnext;
}
else
{
plast=(void * *)&(((TUnit_v *)punit)->pnext);
punit=((TUnit_v *)punit)->pnext;
}
}
}
}
int Chash_v::getPos(TKey &key)
{
int i;
i=key.src_ip&0xffffff;
i+=key.src_port;
i=i&key.dst_ip;
i+=key.dst_port;
return i;
}
bool Chash_v::timeout()
{
time_t lnow;
time(&lnow);
if(lnow-m_lctime>30)
{
m_lctime=lnow;
return true;
}
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -