我正在寻找一个简单的增量散列函数(C ++),以便可以使用:
进行更新 hash = hash_function(hash, update_value)
例如,update_value可以是一位。
例如,为了计算数组的哈希值,我会这样做:
hash = 0
foreach element a in array { hash = hash_function(hash, a) }
(最好是不会导致太多碰撞但速度相对较快的东西。)
答案 0 :(得分:1)
如果您正在散列数组:
您可以实施Cyclic redundancy check. CRC多项式将确定散列长度并且(大致)控制碰撞的可能性。许多示例软件CRC算法被优化以在比比特更宽的事物上操作,但核心的,未优化的算法一次工作一点。该算法大致是:
您提出的方法将当前累加器值作为第一个参数,并返回下一个累加器值。
多项式选择很重要。有些多项式被认为不适合散列。
如果数组包含更宽的内容(如整数或对象):
你可以只散列每个元素,并将每个元素的散列与XOR结合起来。如果单个对象的哈希算法是好的,那么数组的结果哈希也应该相对正常。请注意,首先散列单个对象非常重要。