【发布时间】:2013-06-21 16:04:33
【问题描述】:
我想为哈希表编写一个好的整数哈希函数。即使我怀疑我的哈希表不会太大(比如大小为 36 个元素),生成哈希值的“键”可能会在 0,20,31,.... 11456,13444 等范围内的值之间发生巨大变化. 之前已经在这里发布过类似的问题,我的哈希函数的灵感来自here提供的建议答案。
以下是我的表的结构:
typedef struct _list_t_ {
int key;
int value;
struct _list_t_ *next;
} list_t;
typedef struct _hash_table_t_ {
int size; /* the size of the table */
list_t **table; /* the table elements */
} hash_table_t;
以下是我目前的哈希函数:
unsigned int hash(hash_table_t *hashtable, int key)
{
unsigned int hashval;
hashval = 0;
hashval = key;
hashval = ((hashval >> 16) ^ hashval) * 0x45d9f3b;
hashval = ((hashval >> 16) ^ hashval) * 0x45d9f3b;
hashval = ((hashval >> 16) ^ hashval);
return hashval % hashtable->size; // MOD done to keep within the range of the table size
}
如上所述,生成哈希值的“键”变化很大(值范围从 0、20、31、...11456、13444 等)。问题是我注意到这个散列函数非常频繁地生成相同的散列值。有没有办法可以调整它,以便以新的哈希值结尾的机会更多。
【问题讨论】:
-
很难写出好的散列函数。使用已经过良好测试的现有的。
-
有几个通用哈希函数及其实现,here
-
嗯,它可能很糟糕,但你客观地测试过吗?如果您盯着仅包含 36 个唯一符号的强随机输出,您一定会在其中看到重复的模式。这就是人类大脑的工作方式。这并不意味着散列被破坏了;它只是受到输出范围的过度限制。当然,如果输入不是唯一的,那么输出不能是唯一的。