C++ 完美散列函数是可以实现的吗?

C++ 完美散列函数是可以实现的吗?,c++,boost,hash,C++,Boost,Hash,我正在研究一个通用哈希函数h(k)=((a*k+b)mod p)mod m,方法是使用boost库随机选取a和b,以便实现完美的哈希函数。我正在使用链表技术来检测使用单链表数组的冲突数。循环将继续进行,因为它不会得到count\u collisions=0。下面是一段代码: void hashFunction() { long long int m=0; long long int val=0; cout<<"Enter table size: "; cin>>m; m=

我正在研究一个通用哈希函数
h(k)=((a*k+b)mod p)mod m
,方法是使用boost库随机选取
a
b
,以便实现完美的哈希函数。我正在使用链表技术来检测使用单链表数组的冲突数。循环将继续进行,因为它不会得到
count\u collisions=0。下面是一段代码:

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;*/
void hashFunction()
{
长整型m=0;
long int val=0;
coutm;
m=m*m;
long long int*p=生成的指令和指令键(m);
long long int pno=generatesingerandomno();//素数No'P'
而((pno/1!=pno)&&(pno/pno!=1)&(pnom))
打破
其他的
pno=generateSingleRandomNo();
}
//初始化链接列表!
int cc=0;
斯塔特:
LinkedList**l=新LinkedList*[m];

对于(int i=0;i而言,通常会构造完整的哈希函数,而不是“偶然发现的”

只有很少的事情适合“蒙特卡罗”方法(这意味着,掷骰子的次数足够多,从而得出一个好的近似值)

使用gperf的建议非常好,请参见


您可能需要使用或查看内部,您可能还需要仔细考虑制作一个完美的哈希函数和容忍某些冲突的成本之间的权衡。如果实际冲突的数量足够少,则处理这些冲突的成本可能会低于使用较慢的哈希函数的成本(每次访问都需要计算)缺少的可能有用的函数定义以及
(pno/1!=pno)&(pno/pno!=1)
?@uesp需要选择“p”作为大于“m”(表大小)的素数@朱利奥夫兰科和我已经尝试了很多,调试了很多,以找到完美的功能。我知道我做了一些错误的地方,但没有得到正确的。请帮助我。谢谢。感谢你的回答。我有一点短的时间提交我的工作。你能给我一些代码或一些解决方案,我的代码可以工作。因为我采用了这样一来,初学者很难从头开始重新编写。我希望你能理解。祝你好运!