我需要一些指导来编写哈希函数来对 ~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*HSizelet 散列函数是:

此函数提供[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 个字符串进行排序的主要内容,如果未能解决你的问题,请参考以下文章

为啥不将哈希函数迭代 10,000,000 次? [复制]

哈希表、哈希算法、一致性哈希表

HTML javascript 表单 - 我可以通过哪些其他方式使用表单验证来编写这个 javascript 函数

C 有散列/字典数据结构吗?

创建 Spark 行的 128 位哈希,存储为新列

哈希表查找 - 具有完美的哈希,在 C