试图使用smdb算法做一个哈希表(因为我听到这是明智的,不要试图写我自己的。)我敢肯定,我是完全错误的。我提到我是C新手吗?C smdb散列值%tableSize重复计算为相同的值? (用不同的输入。)
我的hashFunction()%size在第一次调用时返回一个数字,如35,然后在第二次调用,第三次调用,第四次调用时返回65,并返回65。我只是将这些数字用作任意的例子。试图用调试器来弄明白后,我发现散列函数将返回不同的多头,但它们使用相同的最后2个数字全部结束......像这样......
4460735 4526335 4591935
所以我想这是为什么当我散列%大小时,每次都会得到相同的输出结果。这违背了均匀分布键的想法,对吧?
请随便找我。我知道SO上的野蛮人可以如何。
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
char* str;
struct node* next;
}
node;
void insertItem(char* number, node** list);
unsigned long hashFunction(char* str);
int main(void)
{
int size = 100;
int index = 0;
node* buckets[size];
for (int i = 0; i < size; i++)
{
char c = i + 'A';
index = hashFunction(&c) % size;
insertItem(&c, &buckets[index]);
}
}
void insertItem(char* str, node** list)
{
node* newItem = malloc(sizeof(node));
newItem->str = str;
newItem->next = *list;
*list = newItem;
}
unsigned long hashFunction(char* str)
{
//sdbm hash function adapted (incorrectly?) from here: http://www.cse.yorku.ca/~oz/hash.html
unsigned long hash = 0;
int c;
while ((c = *str++))
hash = c + (hash << 6) + (hash << 16) - hash;
return hash;
}
也许使用质数作为'size'可以帮助:http://stackoverflow.com/q/3980117/1025391/HTTP:// stackoverflow.com/q/1145217/1025391? – moooeeeep
啊 - 这不是真正的问题。现在我看... – moooeeeep
@moooeeeep感谢您的提示,但!我以前读过,你说得对,我会在将来考虑。 –