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;*/ }
(pno/1 != pno) && (pno/pno != 1)?