I am working on a universal hash function h(k)=((a*k+b)mod p)mod m
, by picking a
and b
randomly using boost library so that a perfect hash function may achieve. I am using chaining technique to detect number of collisions using array of singly linked lists. Loop will keep on going as it will not get count_collisions=0;
. Here is the piece of code:
void hashFunction()
{
long long int m=0;
long long int val=0;
cout<<"Enter table size: ";
cin>>m;
m=m*m;
long long int *p=generateDistinctRandomKeys(m);
long long int pno=generateSingleRandomNo(); // prime No 'P'
while((pno/1!=pno) && (pno/pno!=1) && (pno<m))
{
if((pno/1==pno) && (pno/pno==1) && (pno>m))
break;
else
pno=generateSingleRandomNo();
}
//intializing linked list !
int cc=0;
startt_:
LinkedList **l=new LinkedList*[m];
for(int i=0;i<m;i++)
{
l[i]=new LinkedList;
//l[i]=NULL;
}
cc++;
int count_collisions=0;
long long int a=generateSingleRandomNo(1,pno-1);
long long int b=generateSingleRandomNo(0,pno-1);
for(int j=0;j<m;j++)
{
//applying hash function !!!
val=(((a*p[j])+b)%(pno))%(m);
if(val<0)
val=val*(-1);
bool f=l[val]->insert(p[j]);
//cout<<val<<endl;
//cc=j;
}
for(int s=0;s<m;s++)
{
//l[s]->display();
count_collisions=count_collisions+l[s]->countCollisions();
}
if(count_collisions==0)
{
cout<<"Perfect function achieved after "<<cc<<" Iterations!"<<endl;
cout<<"Values of a and b are: "<<a<<" and "<<b<<endl;
exit(0);
}
else
{/*
if(cc==5)
{
cout<<"STOP!!!!!!!!!!!!!"<<endl;
exit(0);
}*/
//j=0;
for(int n=0;n<m;n++)
{
l[n]->~LinkedList();
}
delete [] l;
l=0;
goto startt_ ;
}
/*cout<<"Collisions are:"<<count_collisions<<endl;*/
}