我需要一些指导来编写哈希函数来对 ~160,000 个字符串进行排序
Posted
技术标签:
【中文标题】我需要一些指导来编写哈希函数来对 ~160,000 个字符串进行排序【英文标题】:I need some direction on writing a Hash Function to sort ~160,000 strings 【发布时间】:2013-11-21 12:49:03 【问题描述】:我的导师把这个丢给了我们,并告诉我们我们只需要在谷歌上搜索如何编写哈希函数。我在这方面很没有方向。我们为类编写了一个基本的 Hash Table 模板,但我有一个项目,需要将大约 160,000 个字符串分类到一个至少有 500 个桶的表中(我想做更多的速度)。
我只是不知道在哪里可以找到简明易懂的信息。
任何帮助将不胜感激。
【问题讨论】:
考虑实现类似 Shift-Add-XOR 哈希。 eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx 上有一个很好的带有示例的哈希列表 谢谢,这似乎提供了很多信息。 【参考方案1】:我建议universal hash function。即使数据是由对手选择的,这种功能也能保证预期中的少量冲突。有很多通用的哈希函数。
如果是字符串,可以采用下面的哈希函数。
对于字符c,我们定义#(c) c 的算术值,即(ASCII)。对于字符串x=c1c1...cn
,我们定义
如果 HSize 是一个整数,而 k 是一个大素数(你定义它),对于一个范围 0<a,b<k*HSize
let 散列函数是:
此函数提供[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;
【讨论】:
以上是关于我需要一些指导来编写哈希函数来对 ~160,000 个字符串进行排序的主要内容,如果未能解决你的问题,请参考以下文章