我的导师把这个转发给我们,告诉我们我们只需要谷歌如何写一个哈希函数。我对这方面毫无指导。我们为类编写了一个基本的Hash Table模板,但我有一个项目,需要约160,000个字符串才能被分类到一个至少有500个桶的表中(我想为速度做更多的事情)。
我只是不知道在哪里可以获得关于此的简明易懂的信息。
非常感谢任何帮助。
答案 0 :(得分:5)
我建议universal hash function。这种功能保证了期望中的少量冲突,即使数据是由对手选择的。有很多通用哈希函数。
如果是字符串,您可以采用以下哈希函数。
对于字符 c ,我们定义#(c) c 的算术值即(ASCII)。对于字符串x=c1c1...cn
,我们定义
如果 HSize 是一个整数而 k 是一个大素数(你定义它),对于范围0<a,b<k*HSize
,让哈希函数为:
此功能提供[0, HSize-1]
输出值由horner的规则计算,在每次操作后找到k*HSize
除法的模数。
因此,创建一个函数 HashFunction 并将要散列的字符串作为参数传递。 这是代码:
#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;
}