多项式哈希码导致负数
Polynomial hash code results in negative numbers?
对于大j,在某些情况下,下面的哈希函数返回负值。
int hashing::hash(string a)
{
int i = 0;
int hvalue = 0;
int h =0 ;
while(a[i]!=NULL)
{
hvalue = hvalue + (int(a[i]))*pow(31,i);
i++;
}
h = hvalue%j;
return h;
}
这怎么可能?我该如何纠正它?
在上面的代码中,j 是使用文件大小计算的质数。负值出现在字符串形式为"s"的某些特定情况下。
我做错了什么?我该如何解决它?
请记住,int
的范围有限,并且(通常)是一个有符号值。这意味着,如果超过int
的最大可能值,它将环绕并可能变为负数。
有几种方法可以解决这个问题。首先,您可以切换到使用 unsigned int
s 来保存哈希代码,这些代码永远不会是负数,并且在环绕时会表现良好。或者,如果您仍想使用 int
s,您可以通过执行以下操作来屏蔽符号位(数字前面使值为负的位):
return (hvalue & INT_MAX) % j;
(在这里,INT_MAX
在 <climits>
中定义)。这将确保您的值为正数,尽管您从哈希代码中丢失了一些内容,这对于大型数据集可能会导致更多的聚类。在 Mod 之前执行&
的原因是您希望在使用 Mod 之前确保该值为正数,否则您将溢出存储桶数量。
编辑:你的逻辑中也有一个严重的错误。 此循环不正确:
while(a[i]!=NULL) {
...
}
C++ 样式的字符串不以 null 结尾结尾,因此不能保证在读取超过字符串末尾后停止此操作。尝试将其更改为阅读
for (int i = 0; i < a.length(); i++) {
/* ... process a[i] ... */
}
希望这有帮助!
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 使用Qt C++计算类似Git的SHA1哈希
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 用C++将哈希表写入文件并从文件中恢复
- c++找不到具有相同哈希的无序集合元素
- 哈希文件递归并保存到矢量Cryptopp中
- 对 pair<pair<int,int>pair<int,int unordered_map进行哈希处理>>
- 直接在 unordered_map 的方法中使用哈希,而不是生成哈希的用户定义对象
- 如何为字符串生成唯一但一致的 N 位哈希(小于 64 位)?
- 使用对象的基类部分模板专用化对对象进行哈希处理::哈希
- boost::包含提升单元的元组的哈希值
- 使用 Key 对 C++ 中的哈希映射进行排序. 无法排序
- C++中的并发哈希表
- 哈希映射使用 nullptr c++ 初始化节点的动态数组
- 在C++中返回简单哈希码的函数
- 多项式哈希码导致负数
- 哈希图实现:---哈希码
- 如何在c++中获得字符串的哈希码
- 在我的情况下,我如何重载相等的方法以使不同的对象在unordered_multimap具有相同的哈希码值