#include <bwio.h> #include <error.h> #include <hash-table.h> #include <tools.h> int Alpha2Num(char a){ if((a<='Z' && a>='A')) return ((a-'A')+10); if((a<='z' && a>='a')) return ((a-'a')+26+10); if((a<='9' && a>='0')) return (a-'0'); return ILLEGAL_NAME; } void Hash(HT* Table,char* Str, int Len,int *R1,int *R2){ int i = 0; int h1 = 0; int h2 = 0; int tempNum; int MagicNumber = Table->size; for(;i<Len;i++){ h1 *= 62; h2 *= 62; tempNum = Alpha2Num(Str[i]); //if(tempNum == ILLEGAL_NAME) h1 += tempNum; h2 += tempNum; h2 /= MagicNumber; h1 %= MagicNumber; h2 %= MagicNumber; } *R1 = h1; *R2 = h2; } int InsertTo(HT* Table, int Tid, char* Str, int Len){ int h1,h2; int FakeAddr = (int)(Table->NameSequence); Hash(Table,Str,Len,&h1,&h2); bwprintf(COM2,"InserTo: h1:%d, h2:%d\n\r",h1,h2); if(Table->TidSequence[h1]!=-1 && Table->TidSequence[h1+h2]!=-1)return HT_NOSLOT; bwprintf(COM2,"InsertTo: str: %s\n\r",Str); if(Table->TidSequence[h1] == -1){ Table->TidSequence[h1] = Tid; FakeAddr = FakeAddr+(h1*(NAME_LENGTH_MAX+1)); stringCopy((char *)FakeAddr,Str,Len); bwprintf(COM2,"InsertTo: fakeaddr: %s\n\r",(char *)FakeAddr); }else if(Table->TidSequence[h1+h2] == -1){ Table->TidSequence[h1+h2] = Tid; FakeAddr = FakeAddr+((h1+h2)*(NAME_LENGTH_MAX+1)); stringCopy((char *)FakeAddr,Str,Len); bwprintf(COM2,"InsertTo: fakeaddr: %s\n\r",(char *)FakeAddr); } return 0; } int Lookup(HT* Table,char* Str, int Len){ int h1,h2; //bwprintf(COM2,"Hash: before hash\n\r"); Hash(Table,Str,Len,&h1,&h2); int FakeAddr = (int)(Table->NameSequence); FakeAddr +=(h1 *(NAME_LENGTH_MAX + 1)); //bwprintf(COM2,"Hash: after hash, h1: %d, addr2: %d\n\r",h1,((char *)(FakeAddr))); int result = stringCompare(Str,(char *)(FakeAddr)); bwprintf(COM2,"Hash: after compare, result: %d\n\r",result); if(result==0){ return (Table->TidSequence)[h1]; }else{ FakeAddr = (int)(Table->NameSequence); FakeAddr = ((h1+h2)*(NAME_LENGTH_MAX+1)); result = stringCompare(Str,(char *)FakeAddr); if(result == 0) return (Table->TidSequence)[h1+h2]; } return -1; }