我想为散列表编写一个好的整数散列函数。即使我怀疑我的散列表不会太大(比如说大小为36的元素),生成散列值的“关键字”可能会大幅度变化,范围从0,20,21,... 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等)。问题是我注意到这个哈希函数非常频繁地生成相同的哈希值。有没有一种方法可以调整它,以便以新的哈希值结束的机会更多。
很难写出一个好的散列函数。使用经过良好测试的现有产品。 – 2013-06-21 16:10:42
有几个通用的散列函数和它们的实现,[这里](http://www.partow.net/programming/hashfunctions/) – Kninnug
那么它可能是坏的,但你有客观测试它吗?如果你盯着只包含36个独特符号的强大随机输出,你肯定会看到它重复的模式。这只是人类大脑的工作方式。这并不意味着散列被破坏;它只是受到输出范围的限制。当然,如果输入不唯一,那么输出_cannot_是唯一的。 – sh1