今天上课了:
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语句应该做什么时遇到一些麻烦。
有什么想法吗?
由于
答案 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
为正数,因为当您在负数上使用%
运算符时,您可能会得到负值结果,这对于哈希值是不可取的。
但是,这确实会因整数溢出而进入未定义的行为,因此它可能无处不在。