c++ - 我需要一些指导来编写哈希函数来对 ~160,000 个字符串进行排序

标签 c++ string dictionary hashtable hash-function

我的导师把这个丢给了我们,并告诉我们我们只需要用谷歌搜索如何编写哈希函数。我对此很迷茫。我们为类(class)编写了一个基本的哈希表模板,但我有一个项目需要将大约 160,000 个字符串分类到一个至少有 500 个桶的表中(我想做更多以提高速度)。

我只是不知道去哪里寻找关于此的简明、易于理解的信息。

如有任何帮助,我们将不胜感激。

最佳答案

我建议 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] 之间的输出

输出值是根据霍纳规则计算的,找到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;
}

关于c++ - 我需要一些指导来编写哈希函数来对 ~160,000 个字符串进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19877203/

相关文章:

c++ - 从包含特殊字符的字符串中获取所有子字符串的有效方法

java - 我可以在不使用构造函数的情况下在 Java 中设置 String 的值吗?

python - 在 Python 中基于键/值过滤字典和创建子字典?

c++ - 列表实现没有正确地对列表求和

c++ - 如何在不解压缩的情况下创建并附加到 gz 文件?

python - 使用 Python 转义序列格式化字符串

python - 无法使用唯一的第一个键确定性地更新嵌套字典

python - 检查一个词是否存在于字典中没有找到任何词

c++ - 简单便携的乒乓通讯

python - 从 python 中的不同字符串生成 'random' 字符串?