【发布时间】:2015-12-18 09:58:39
【问题描述】:
我正在使用可扩展的哈希,并且我希望将字符串作为键。问题是我正在使用的当前哈希函数迭代整个字符串/键,我认为这对程序的性能非常不利,因为哈希函数被多次调用,尤其是在我拆分存储桶时。
当前哈希函数
int hash(const string& key)
{
int seed = 131;
unsigned long hash = 0;
for(unsigned i = 0; i < key.length(); i++)
{
hash = (hash * seed) + key[i];
}
return hash;
}
键可以长达 40 个字符。
字符串/键示例
string key = "from-to condition"
我已经在互联网上搜索了一个更好的,但我没有找到任何与我的情况相匹配的东西。有什么建议吗?
【问题讨论】:
-
40 个字符并没有那么长。并且您使用的当前哈希函数与 std 库中的哈希函数相比没有任何优势。上次我检查时,MSVC 使用 FNV1a 处理字符串,它不应该比你的慢,但对于散列来说要好得多。我没有检查,但 GCC 可能使用相同的。
-
您的哈希值错误。它很容易溢出,整数溢出是未定义的行为。
-
不,它不能(好吧,除非 ULONG_MAX == INT_MAX,这是一个非常病态的实现。事实上,我不认为它是合法的。)计算是在
unsigned long中完成的哪个溢出是完美定义的。 -
嗯,我是在网上找到的。我想我得再找一个了。
-
@UmNyobe 他的哈希值不好的事实与溢出无关。如前所述,无符号溢出是完美定义的。几乎所有的哈希算法都使用溢出。
标签: c++ hash-function