我的老师把这个甩给了我们,并告诉我们我们只需要谷歌一下如何编写哈希函数。我对此很没有方向。我们为类编写了一个基本的哈希表模板,但我有一个项目需要将大约 160,000 个字符串排序到至少有 500 个存储桶的表中(为了速度我想做更多)。
我只是不知道在哪里可以找到简洁、易于理解的信息。
任何帮助将不胜感激。
我建议一个通用哈希函数 http://en.wikipedia.org/wiki/Universal_hashing。即使数据是由对手选择的,这种函数也能保证预期的少量冲突。有很多通用哈希函数。
如果是字符串,可以采用以下哈希函数。
For a character c we define #(c) the arithmetic value of c ie(ASCII). For a string x=c1c1...cn
we define ![enter image description here](https://i.stack.imgur.com/mAiFV.png)
![enter image description here](https://i.stack.imgur.com/lJsSy.png)
If HSize是一个整数并且k一个大素数(你定义它),对于一个范围0<a,b<k*HSize
设哈希函数为:
该函数提供之间的输出[0, HSize-1]
输出值通过霍纳法则计算,找到模数k*HSize
每次操作后的划分。
所以,创建一个函数哈希函数并将要散列的字符串作为参数传递。
这是代码:
#define k 7919
#define Hsize 1009
#define a 321
#define b 43112
long long HashFunction(string text)
{
int i;
long long res = 0;
long long M = (Hsize * k);
cout<<"M = "<<M<<endl;
cout<<"Hsize = "<<Hsize<<endl;
cout<<"k = "<<k<<endl;
int s=text.size();
for(i = s-1; i >= 0; i--)
{
res = a * (res * 256 + (int)text[i]);
//cout<<"res before modulo = "<<res<<endl;
res=res % M;
//cout<<"res after modulo = "<<res<<endl;
}
long long res1 = (res + b) / k;
return res1;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)