所以我的问题是我试图使用截断哈希函数作为冲突索引增量/减量...我不得不使用它作为第一个主函数,并使用更统一的哈希函数作为第二个哈希函数取而代之。
我的更正代码如下:
// ============================ 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);
}
答案 0 :(得分:1)
您可以为4- 字母字符串创建完美的“哈希”。
拉丁字母表中少于32个字母,如果区分大写和小写字母,拉丁字母表中的字母少于64个。
为什么要提到32和64?因为他们是两个人的第五和第六力量。 我们可以创建一个32位整数,它唯一地表示一个4个字母的单词(区分大写和小写字母),如下所示:
通过编码,我的意思是:
您甚至可以将每个字母编码为key - 'A' + 1
,如您所愿。
我强烈建议您创建一个接受字符并返回其编码值的函数。通常,如果您发现自己在3个以上的位置编写相同的代码,则应考虑将其作为函数。
同样重要的是,由于编写散列函数主要是关于小工具,因此您应该学习如何使用移位运算符<
和>
而不是pow
。
您还应该了解整数运算。
您1 / (1 - (key2[2] - 'A' + 1))
可能返回的具体内容是什么?
您的所有功能都不能称为“哈希函数”。 如果你想使用“截断”或“分裂”之类的东西,你应该先弄明白这意味着什么。