C++ 多项式散列码导致负数?
对于大j函数,在某些情况下,下面的哈希函数返回负值C++ 多项式散列码导致负数?,c++,math,hash,C++,Math,Hash,对于大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; } 这怎么可能?我怎样才能纠正
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\u MAX
)。这将确保您的值为正值,尽管您的哈希代码会丢失一点,这对于大型数据集可能会导致更多的集群。在mod之前执行&
的原因是,在执行mod之前,您希望确保值为正值,否则将导致桶数溢出
编辑:您的逻辑也有严重错误。这是不正确的:
while(a[i]!=NULL) {
...
}
C++风格的字符串不是以null结尾的,因此不能保证在读取超过字符串末尾时停止。尝试将此更改为
for (int i = 0; i < a.length(); i++) {
/* ... process a[i] ... */
}
for(inti=0;i
希望这有帮助 记住,
int
有一个有限的范围,通常是一个有符号的值。这意味着,如果超过int
的最大可能值,它将环绕并可能变为负值
有几种方法可以解决这个问题。首先,您可以切换到使用unsigned int
s来保存哈希代码,哈希代码从来都不是负数,在换行时表现良好。或者,如果仍要使用int
s,可以通过以下操作屏蔽符号位(使值为负值的数字前面的位):
return (hvalue & INT_MAX) % j;
(此处,
中定义了INT\u MAX
)。这将确保您的值为正值,尽管您的哈希代码会丢失一点,这对于大型数据集可能会导致更多的集群。在mod之前执行&
的原因是,在执行mod之前,您希望确保值为正值,否则将导致桶数溢出
编辑:您的逻辑也有严重错误。这是不正确的:
while(a[i]!=NULL) {
...
}
C++风格的字符串不是以null结尾的,因此不能保证在读取超过字符串末尾时停止。尝试将此更改为
for (int i = 0; i < a.length(); i++) {
/* ... process a[i] ... */
}
for(inti=0;i
希望这有帮助 使用这个我不会得到一个负值,但是我得到的是一个最大int值的错误。我如何解决这个问题???@user2648875-您是否
#包括?是的。我不再得到一个负值,而是得到了INT_MAXint hashing::hash(string a){INT i=0;INT hvalue=0;INT h=0;while(a[i]!=NULL){hvalue=hvalue+(INT(a[i]))*power(31,i);i++}h=hvalue%j;返回h&INT_MAX;}@user2648875-您得到了什么具体的错误?你能详细说明一下吗?这似乎在我的系统上运行良好。使用它,我不会得到负值,但得到的是最大int值的错误。我如何解决这个问题???@user2648875-您是否#包括?是的。我不再得到一个负值,而是得到了INT_MAXint hashing::hash(string a){INT i=0;INT hvalue=0;INT h=0;while(a[i]!=NULL){hvalue=hvalue+(INT(a[i]))*power(31,i);i++}h=hvalue%j;返回h&INT_MAX;}@user2648875-您得到了什么具体的错误?你能详细说明一下吗?这似乎在我的系统上运行良好。