哈希函数说明

时间:2015-10-01 01:27:10

标签: c++ data-structures

今天上课了:

const int tabsize = 100000;

int hash(string s) {
    const int init = 21512712, mult = 96169, emergency = 876127;
    int v = init;
    for (int i=0; i<s.length(); i+=1)
        v = v * mult + s[i];
    if (v < 0) v = -v;
    if (v < 0) v = emergency;
    return v % tabsize;
}

在弄清楚最后两个if语句应该做什么时遇到一些麻烦。

有什么想法吗?

由于

2 个答案:

答案 0 :(得分:3)

第一个if语句负责有符号整数的溢出行为。因此,如果整数变得太大以至于它包装并变为负数,则此if语句将确保仅返回正整数。

第二个if语句用于处理v为2147483648的罕见情况。

请注意,带正号的32位整数最多只能达231 - 1 or 2147483647,负数可以降至-231 or -2147483648

此数字为否定甚至否定它仍然给出一个负数。这就是

的紧急号码
int main() {
    int t = -2147483648;
    std::cout << (-t) << std::endl;
}

答案 1 :(得分:1)

他们确保v为正数,因为当您在负数上使用%运算符时,您可能会得到负值结果,这对于哈希值是不可取的。

但是,这确实会因整数溢出而进入未定义的行为,因此它可能无处不在。