可以实现完美的哈希函数
Is perfect hash function achieveable?
我正在开发一个通用的哈希函数h(k)=((a*k+b)mod p)mod m
,通过使用boost库随机选择a
和b
,可以实现完美的哈希函数。我正在使用链接技术来检测使用单链表数组的冲突数量。循环将继续进行,因为它不会得到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;*/
}
Perect散列函数通常是构造的,而不是"偶然发现的"。
只有很少的事情适合"蒙特卡洛"方法(这意味着,经常掷骰子以获得良好的近似值)。
使用gperf的建议非常好,例如参见
- 是否可以比使用hashmap更快地将字符串映射到int
相关文章:
- 如何为位集找到/实现一个好的哈希函数
- 对于短字符串来说,这是一个很好的哈希函数吗?
- 我在C++中使用提升哈希函数将 3 个双精度组合成一个面临冲突的哈希
- 无冲突的哈希函数
- Qt5 哈希函数在 Windows 7 和 Windows10 上不会返回相同的哈希
- 解决由于在哈希函数中使用了不完整的类型而导致的编译失败
- 使用 Murmur2 64 位哈希函数生成会导致冲突的输入
- 错误:哈希函数必须可使用键类型的参数进行调用
- unordered_set是否适合存储矢量<int>元素的数据结构?如果是这样,我将如何实现哈希函数?
- 为什么C++哈希函数的返回类型是 std::size_t,而不是独立于平台的类型?
- 哈希函数计算
- 哈希函数中同一键的不同值和良好的哈希值排序
- 将 C# 哈希函数转换为C++
- 如何创建用于生成噪声的哈希函数
- 插入不从哈希函数中检索键
- 简单的 C++11 哈希函数无法编译
- 对于这个英语单词列表来说,什么是好的哈希函数?
- std::bitset 哈希函数算法
- 如何生成伪随机 32 字节字符串以用作加密哈希函数中的盐?
- C unordered_map自定义的哈希函数碰撞