散列函数 - 截断和除法

时间:2015-04-19 18:20:29

标签: c++

所以我的问题是我试图使用截断哈希函数作为冲突索引增量/减量...我不得不使用它作为第一个主函数,并使用更统一的哈希函数作为第二个哈希函数取而代之。

我的更正代码如下:

// ============================ HASH FUNCTIONS ============================ \\


  // Hash function 1 (Base-26)
  int Hash_1(char *key2)
  {
        int index;
        index = (int)((key2[0] - 'A' + 1) * pow(26, 3)) + ((key2[1] - 'A' + 1) * pow(26, 2)) + ((key2[2] - 'A' + 1) * 26) + ((key2[3] - 'A' + 1));
        return (index % TABLESIZE);
  }


  // Hash function 2 (Folding)
  int Hash_2(char *key2)
  {
        int index;
        index = ((key2[0] - 'A' + 1) * (key2[1] - 'A' + 1)) + ((key2[2] - 'A' + 1) * (key2[3] - 'A' + 1));
        return (index % TABLESIZE); 
  }


  // Hash function 3 (Truncation)
  int Hash_3(char *key2)
  {
        int index;
        index = ((key2[1] - 'A' + 1) * (key2[2] - 'A' + 1));
        return (index % TABLESIZE);
  }

// ========================= DOUBLE HASH FUNCTIONS ========================= \\


  // Double hash 1 (Linear Probing)
  int ProbeDec_1(char *key2)
  {
      return 1;
  }


  // Double hash 2 (Middle Squaring)
  int ProbeDec_2(char *key2)
  {
      int index;
      index = (int)pow(((key2[1] - 'A' + 1) + (key2[2] - 'A' + 1)), 2);
      return (index % TABLESIZE);
  }


  // Double hash 3 (Division)
  int ProbeDec_3(char *key2)
  {
      int index;
      int primeNum = 7;
      index = max((key2[3] / primeNum), 1) % primeNum;
      return (index % TABLESIZE);
  }

1 个答案:

答案 0 :(得分:1)

您可以为4- 字母字符串创建完美的“哈希”。

拉丁字母表中少于32个字母,如果区分大写和小写字母,拉丁字母表中的字母少于64个。

为什么要提到32和64?因为他们是两个人的第五和第六力量。 我们可以创建一个32位整数,它唯一地表示一个4个字母的单词(区分大写和小写字母),如下所示:

  • 位0到5编码字符串的第一个字母
  • 位6到11编码第二个
  • 位12到17编码第三个
  • 位18到23编码第四个
  • 位24至31设置为0

通过编码,我的意思是:

  • “A”编码为000000
  • “a”编码为000001
  • “B”是000010
  • “b”是000011 等等。我们知道我们可以使用您想要的任何编码来匹配所有字母,因为字母数量少于可用位数排列。

您甚至可以将每个字母编码为key - 'A' + 1,如您所愿。

我强烈建议您创建一个接受字符并返回其编码值的函数。通常,如果您发现自己在3个以上的位置编写相同的代码,则应考虑将其作为函数。

同样重要的是,由于编写散列函数主要是关于小工具,因此您应该学习如何使用移位运算符<>而不是pow

您还应该了解整数运算。 您1 / (1 - (key2[2] - 'A' + 1))可能返回的具体内容是什么?

您的所有功能都不能称为“哈希函数”。 如果你想使用“截断”或“分裂”之类的东西,你应该先弄明白这意味着什么。