【问题标题】:Is perfect hash function achieveable?完美的哈希函数可以实现吗?
【发布时间】:2014-09-07 16:38:52
【问题描述】:

我正在研究通用哈希函数h(k)=((a*k+b)mod p)mod m,通过随机选择ab 使用boost 库,以便可以实现完美的哈希函数。我正在使用链接技术来检测使用单链表数组的冲突数量。循环将继续进行,因为它不会得到count_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;*/

}

【问题讨论】:

  • 您可能想使用或查看gperf内部
  • 您可能还需要三思而后行,在制作完美的散列函数和容忍一些冲突的代价之间进行权衡。如果实际冲突的数量足够少,那么处理它们的成本可能会低于使用较慢的哈希函数(每次访问都需要计算)的成本
  • 您缺少可能有用的函数定义以及(pno/1 != pno) &amp;&amp; (pno/pno != 1) 的用途是什么?
  • @uesp 要求选择“p”作为大于“m”(表大小)的素数
  • @GiulioFranco 和我已经尝试了很多并调试了很多以找到完美的功能。我知道我在某处做错了,但没有正确理解。请帮帮我。谢谢。

标签: c++ boost hash


【解决方案1】:

完美哈希函数通常是构造出来的,而不是“偶然发现的”。

只有很少的东西适合“蒙特卡洛”方法(这意味着经常掷骰子以达到良好的近似值)。

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

【讨论】:

  • 感谢您的回答。我有一点时间来提交我的工作。你能给我一些代码或我的代码的一些解决方案,以便它可以工作。因为我采用了这种方式,初学者很难从头开始重写它。我希望你明白。亲切的问候!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 2012-03-22
  • 2023-03-03
  • 2019-05-22
  • 2022-11-02
  • 1970-01-01
相关资源
最近更新 更多