C++ 多项式散列码导致负数?

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; } 这怎么可能?我怎样才能纠正

对于大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\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-您得到了什么具体的错误?你能详细说明一下吗?这似乎在我的系统上运行良好。