通用散列实现中的整数溢出

时间:2017-04-20 23:40:09

标签: python numpy hash

对于我的一个宠物项目,我想创建任意数量的不同整数哈希值。经过一番研究后,我认为通用散列是可行的方法。但是,我努力实现(numpy)。假设我尝试使用哈希族h(a,b)(x) = ((a * x + b) mod p) mod m,我的x可以在uint32范围内的任何位置。然后选择p >= max(x)a, b < p意味着在最坏的情况下a * x + b不仅溢出uint32而且溢出uint64。我试图找到一个解决这个问题的实现,但只找到了加速模运算的巧妙方法,而不是溢出。

非常感谢任何有关如何实现这一点的建议。谢谢: - )

1 个答案:

答案 0 :(得分:1)

(x + y) % z == ((x % z) + (y % z)) % z。所以你可以在做总和之前取模数:

  1. ax投射到uint64。 (乘以两个uint32永远不会溢出uint64)。
  2. 计算h = (a * x) % p + b
  3. 返回(h - p) if h > p else h。 (或者:返回h % p