如何逐步更新哈希值?

时间:2014-06-04 20:44:21

标签: c++ c hash

我正在寻找一个简单的增量散列函数(C ++),以便可以使用:

进行更新
               hash = hash_function(hash, update_value)
例如,

update_value可以是一位。

例如,为了计算数组的哈希值,我会这样做:

              hash = 0
              foreach element a in array { hash = hash_function(hash, a) }

(最好是不会导致太多碰撞但速度相对较快的东西。)

1 个答案:

答案 0 :(得分:1)

如果您正在散列数组:

您可以实施Cyclic redundancy check. CRC多项式将确定散列长度并且(大致)控制碰撞的可能性。许多示例软件CRC算法被优化以在比比特更宽的事物上操作,但核心的,未优化的算法一次工作一点。该算法大致是:

  1. 从累加器中的一些常量种子值开始
  2. 从数组中移出一点进入累加器。
  3. 有条件地,使用多项式执行XOR。不同的实现要么使用刚刚移出的位,要么移入有条件的位。
  4. 重复后续位(转到2)。
  5. 您提出的方法将当前累加器值作为第一个参数,并返回下一个累加器值。

    多项式选择很重要。有些多项式被认为不适合散列。

    如果数组包含更宽的内容(如整数或对象):

    你可以只散列每个元素,并将每个元素的散列与XOR结合起来。如果单个对象的哈希算法是好的,那么数组的结果哈希也应该相对正常。请注意,首先散列单个对象非常重要。