我需要一些关于编写Hash函数的方向来排序~160,000个字符串

时间:2013-11-09 14:38:09

标签: c++ string dictionary hashtable hash-function

我的导师把这个转发给我们,告诉我们我们只需要谷歌如何写一个哈希函数。我对这方面毫无指导。我们为类编写了一个基本的Hash Table模板,但我有一个项目,需要约160,000个字符串才能被分类到一个至少有500个桶的表中(我想为速度做更多的事情)。

我只是不知道在哪里可以获得关于此的简明易懂的信息。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:5)

我建议universal hash function。这种功能保证了期望中的少量冲突,即使数据是由对手选择的。有很多通用哈希函数。

如果是字符串,您可以采用以下哈希函数。

对于字符 c ,我们定义#(c) c 的算术值即(ASCII)。对于字符串x=c1c1...cn,我们定义enter image description here enter image description here

如果 HSize 是一个整数而 k 是一个大素数(你定义它),对于范围0<a,b<k*HSize,让哈希函数为:

enter image description here

此功能提供[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;
}