为什么BKDFHash不关心超出范围的问题?

时间:2017-05-01 06:13:54

标签: c++ hash hashcode

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范围时会发生什么?

1 个答案:

答案 0 :(得分:1)

这是有效的,因为根据标准,unsigned整数类型实际上不会发生溢出:

  

3.9.1基本类型[basic.fundamental]

     

无符号整数应遵守算术模2 n 的定律,其中n是   该特定大小的值表示中的位数   整数。 48

     
      
  1. 这意味着无符号算术不会溢出,因为结果无法表示   无符号整数类型以模数的形式减少,该数字大于可由结果无符号整数类型表示的最大值。
  2.   

例如:如果unsigned int算术结果x超过UINT_MAX,结果就是:

x % (UINT_MAX+1)

从而在0...UINT_MAX

中留下结果