我想为哈希表编写一个好的整数哈希函数。即使我怀疑我的哈希表不会太大(比如大小为 36 个元素),生成哈希值的“键”可能会在 0,20,31,.... 11456,13444 等范围内的值之间发生巨大变化.类似的问题之前已经在这里发布过,我的哈希函数的灵感来自于此处提供的建议答案。
以下是我的表的结构:
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 等)。问题是我注意到这个散列函数非常频繁地生成相同的散列值。有没有办法可以调整它,以便以新的哈希值结束的机会更多。