#include #include #include #include #include #include #include #include #include #include #include "runn.h" #include "Hash.h" using namespace std; namespace iret { Hash::Hash(void) : FBase("hshset","null"){ } Hash::Hash(const char *nam) : FBase("hshset",nam){ } Hash::Hash(int n,const char *nam) : FBase("hshset",n,nam){ } Hash::~Hash(){ } void Hash::create_htable(List &Lst,int excess){ char cnam[max_str],*cptr,*uptr; int u,len; long ct,i,j,k; ofstream *pfout; nwrds=Lst.cnt_key; ct=nwrds; tnum=1; u=0; while(ct=ct/2){tnum*=2;u++;} if(u>30){cout << "Error in size, " << u << endl;exit(0);} i=0; while((u<32)&&(i30){cout << "Error in size, " << u << endl;exit(0);} i=0; while((u<32)&&(i30){cout << "Error in size, " << u << endl;exit(0);} i=0; while((u<32)&&(i> nwrds >> tnum >> asize; dst_Istr(pfin); harr=(long*)get_Mmap("ha"); addr=(long*)get_Mmap("ad"); strmap=get_Mmap("str"); farr=new long[1536]; ct=1; for(i=0;i<1536;i++){ farr[i]=ct=(ct*331)&tnum; } px0=farr,px1=farr+128,px2=farr+256; px3=farr+384,px4=farr+512,px5=farr+640; px6=farr+768,px7=farr+896,px8=farr+1024; px9=farr+1152,px10=farr+1280,px11=farr+1408; } void Hash::gopen_htable_map(int mz){ char cnam[max_str],*cptr; int fld; long ct,asize,i; ifstream *pfin=get_Istr(mz,"nm"); *pfin >> nwrds >> tnum >> asize; dst_Istr(pfin); harr=(long*)get_Mmap(mz,"ha"); addr=(long*)get_Mmap(mz,"ad"); strmap=get_Mmap(mz,"str"); farr=new long[1536]; ct=1; for(i=0;i<1536;i++){ farr[i]=ct=(ct*331)&tnum; } px0=farr,px1=farr+128,px2=farr+256; px3=farr+384,px4=farr+512,px5=farr+640; px6=farr+768,px7=farr+896,px8=farr+1024; px9=farr+1152,px10=farr+1280,px11=farr+1408; } void Hash::gopen_htable_copy(Hash *pH){ char cnam[max_str],*cptr; int fld; long ct,asize,i; nwrds=pH->nwrds; tnum=pH->tnum; harr=pH->harr; addr=pH->addr; strmap=pH->strmap; farr=pH->farr; px0=farr,px1=farr+128,px2=farr+256; px3=farr+384,px4=farr+512,px5=farr+640; px6=farr+768,px7=farr+896,px8=farr+1024; px9=farr+1152,px10=farr+1280,px11=farr+1408; } long Hash::find(const char *str){ register long ct=0,i=0,k; register int ic; register const char *utr=str; while(ic=*(utr++)){ switch(i){ case 0: ct+=*(px0+ic); break; case 1: ct+=*(px1+ic); break; case 2: ct+=*(px2+ic); break; case 3: ct+=*(px3+ic); break; case 4: ct+=*(px4+ic); break; case 5: ct+=*(px5+ic); break; case 6: ct+=*(px6+ic); break; case 7: ct+=*(px7+ic); break; case 8: ct+=*(px8+ic); break; case 9: ct+=*(px9+ic); break; case 10: ct+=*(px10+ic); break; case 11: ct+=*(px11+ic); i-=12; break; } i++; } k=ct&tnum; ct=harr[k+1]; i=harr[k]; //cout << k << " " << i << " " << addr[i] << " " << ct << " " << addr[ct] << endl; switch(ct-i){ case 0: return(0); break; case 1: if(!strcmp(str,strmap+addr[i]))return(i+1); else return(0); break; case 2: ic=strcmp(str,strmap+addr[i]); if(ic>0){ if(!strcmp(str,strmap+addr[i+1]))return(i+2); else return(0); } else if(ic<0)return(0); else return(i+1); break; default: ic=strcmp(str,strmap+addr[i]); if(ic<0)return(0); else if(!ic)return(i+1); ct--; ic=strcmp(str,strmap+addr[ct]); if(ic>0)return(0); else if(!ic)return(ct+1); while(ct-i>1){ k=(ct+i)/2; ic=strcmp(str,strmap+addr[k]); if(ic>0)i=k; else if(ic<0)ct=k; else return(k+1); } return(0); } } void Hash::gclose_htable_map(void){ dst_Mmap("ha",(char*)harr); dst_Mmap("ad",(char*)addr); dst_Mmap("str",strmap); delete [] farr; } void Hash::gclose_htable_map(int mz){ dst_Mmap(mz,"ha",(char*)harr); dst_Mmap(mz,"ad",(char*)addr); dst_Mmap(mz,"str",strmap); delete [] farr; } //Chash code Chash::Chash() : Hash(){ change_type("cshset"); } Chash::Chash(const char *str) : Hash(str){ change_type("cshset"); } Chash::Chash(int n,const char *str) : Hash(n,str){ change_type("cshset"); } Chash::~Chash(void){} void Chash::create_ctable(Count &Ct,int excess){ create_htable(Ct,excess); gopen_htable_map(); long n,i=0; long *pct=new long[Ct.cnt_key]; Ct.node_first(); while(Ct.node_next()){ if(n=find(Ct.show_str())){ pct[n-1]=Ct.count(); } else { cout << "Error in Count tree!" << endl;exit(0); } mark(++i,10000,"count terms"); } bin_Writ("ct",Ct.cnt_key*sizeof(long),(char*)pct); delete [] pct; cnt=(long*)get_Mmap("ct"); gclose_htable_map(); } void Chash::create_ctable(List &Lt,int excess){ create_htable(Lt,excess); gopen_htable_map(); long n,i=1; long *pct=new long[Lt.cnt_key]; Lt.node_first(); while(Lt.node_next()){ if(n=find(Lt.show_str())){ pct[n-1]=i; } else { cout << "Error in List tree!" << endl;exit(0); } mark(++i,10000,"count terms"); } bin_Writ("ct",Lt.cnt_key*sizeof(long),(char*)pct); delete [] pct; cnt=(long*)get_Mmap("ct"); gclose_htable_map(); } void Chash::create_ctable(int mz,Count &Ct,int excess){ create_htable(mz,Ct,excess); gopen_htable_map(mz); long n,i=0; long *pct=new long[Ct.cnt_key]; Ct.node_first(); while(Ct.node_next()){ if(n=find(Ct.show_str())){ pct[n-1]=Ct.count(); } else { cout << "Error in Count tree!" << endl;exit(0); } mark(++i,10000,"count terms"); } bin_Writ(mz,"ct",Ct.cnt_key*sizeof(long),(char*)pct); delete [] pct; cnt=(long*)get_Mmap(mz,"ct"); gclose_htable_map(mz); } void Chash::create_ctable(int mz,List &Lt,int excess){ create_htable(mz,Lt,excess); gopen_htable_map(mz); long n,i=1; long *pct=new long[Lt.cnt_key]; Lt.node_first(); while(Lt.node_next()){ if(n=find(Lt.show_str())){ pct[n-1]=i; } else { cout << "Error in List tree!" << endl;exit(0); } mark(++i,10000,"count terms"); } bin_Writ(mz,"ct",Lt.cnt_key*sizeof(long),(char*)pct); delete [] pct; cnt=(long*)get_Mmap(mz,"ct"); gclose_htable_map(mz); } void Chash::gopen_ctable_map(void){ gopen_htable_map(); cnt=(long*)get_Mmap("ct"); } void Chash::gopen_ctable_map(int mz){ gopen_htable_map(mz); cnt=(long*)get_Mmap(mz,"ct"); } void Chash::gclose_ctable_map(void){ gclose_htable_map(); dst_Mmap("ct",(char*)cnt); } void Chash::gclose_ctable_map(int mz){ gclose_htable_map(mz); dst_Mmap(mz,"ct",(char*)cnt); } long Chash::count(const char *str){ long n=find(str); if(n)return(cnt[n-1]); else return(0); } }