unsigned int BKDRHash(const std::string& str){
unsigned int seed = 131; // 31 131 1313 13131 131313 etc..
unsigned int hash = 0;
for(std::size_t i = 0; i < str.length(); i++)
{
hash = (hash * seed) + str[i];
}
return hash;}
为什么我们不需要关心哈希是否超出上述代码中unsigned int
的范围?我已经看到几个示例代码对溢出问题没有任何作用。为什么它仍然有效?当值hash
超出unsigned int
范围时会发生什么?
答案 0 :(得分:1)
这是有效的,因为根据标准,unsigned
整数类型实际上不会发生溢出:
3.9.1基本类型[basic.fundamental]
无符号整数应遵守算术模2 n 的定律,其中n是 该特定大小的值表示中的位数 整数。 48
- 这意味着无符号算术不会溢出,因为结果无法表示 无符号整数类型以模数的形式减少,该数字大于可由结果无符号整数类型表示的最大值。
醇>
例如:如果unsigned int
算术结果x
超过UINT_MAX
,结果就是:
x % (UINT_MAX+1)
从而在0...UINT_MAX