我目前正在使用哈希函数:
unsigned long hashFunc(const char *str, unsigned int tablesize ) // djb2 hash
{
unsigned long hash = 5381;
int c;
while (c = *str++)
hash = ((hash << 5) + hash)+ c; /* hash * 33 + c */
return (hash & tablesize)-1;
}
显然,按位运算符&amp;对于某些长值失败并返回long的最大值。例如,用表大小为63的“care”一词进行哈希处理会返回0xffffffff。
按位运算符是否打算用于无符号长整数?如果是这样,我还有其他选择吗?
答案 0 :(得分:3)
你需要在括号内加上“-1”:
return (hash & (tablesize - 1));
这只有在知道tableize是2的幂时才有效。
如果tablesize不是2的幂,那么你应该使用模运算符“%”:
return hash % tablesize;
(在这种情况下不需要“-1”)。
答案 1 :(得分:0)
这两种类型 - unsigned int
和unsigned long
可能具有不同的大小,这可能会导致按位操作执行您不期望的操作。
尝试投射:
return (hash & (unsigned long)tablesize)-1;
(或使用static_cast
,如果你坚持的话)
答案 2 :(得分:0)
我测试了一下,它似乎工作得很好。
简单地说,运气不好 - hash
("care",63)
的价值是0x17c9504c0
,当你执行二元时 - 0x3f
你得到的是0。减去1并且你得到0xffffffffffffffff
。
问题在于您的代码,而不在机器中:)