什么哈希函数" hacks"你用吗?

时间:2016-10-20 13:29:50

标签: data-structures hash hashmap hashtable hashcode

哈希函数可以依赖于数据。例如(来自this文章)如果你的数据都是字符串并且几乎所有字符串都有不同的长度,那么一个简单的字符串长度可能是一个非常好的哈希函数(我知道这不太现实)。或者例如从0到1的实数可以具有简单的散列函数:

  

value * sizeOfHashTable

如果您使用围绕输入量身定制的散列函数,我感兴趣吗?还有更多例子吗?

1 个答案:

答案 0 :(得分:1)

正如您所正确指出的,散列函数取决于散列数据。 设计良好哈希函数的常见想法 - 遵守3个条件:

  • 功能必须易于计算。也许,最好不要使用非常好的哈希值,但要快速计算,并节省更多的哈希时间,而不是在不平衡的桶或表路径上丢失。

  • 函数必须在测试数据集上具有良好的分布(伪随机)。好主意 - 在哈希函数"雪崩效果"中使用,当改变输入数据中的单个位时,输出值的半位变化。

  • 对于外部输入数据,哈希函数必须是"通用",即抵制尝试生成冲突。

我最喜欢的哈希函数如下。在第一次使用之前,需要使用一些随机值初始化表S_block。在每个程序运行中都可以做到这一点。

const unsigned int S_block[256] = { ... };
#define NLF(h, c) (S_block[(unsigned char)(c + h)] ^ c)

unsigned int hash(const char *key) {
unsigned int h = 0x1F351F35;
char c;
while(c = *key++)
  h = ((h << 7) | (h >> (32 - 7))) + NLF(h, c);
h ^= h >> 16;
return h ^ (h >> 8);
}

作为实际示例,请参阅我的程序emcSSH中使用此功能的变体。文件htable.c包含此函数的变体,适用于double hashing算法。