有序列表的复合哈希

时间:2012-05-16 02:58:24

标签: algorithm hash

假设我有某种类型的n个对象(x1,x2,...,xn)的有序列表(例如可变长度二进制数据文件)。

这些对象中的每一个都是安全哈希(例如SHA1)以生成m位哈希码(h1,h2,...,hn)

我现在希望将这些哈希码组合成一个复合代码,该唯一且安全(忽略可忽略的冲突概率)标识有序列表。

(假设对象很大并且再次读取它们的实际数据不是一个选项)

执行此操作的一种天真且不正确的方法是将哈希码XOR一起进行异或。这具有不期望的属性,(x1,x2)将具有与(x2,x1)相同的复合代码。

我可以通过什么算法组合哈希码以获得所需的属性?

2 个答案:

答案 0 :(得分:2)

出于一致性和安全性的原因,我会通过将SHA-1应用于SHA-1个体哈希的连接来组合列表项的各个哈希值。

答案 1 :(得分:1)

可能你可以使用与java中相同的算法来获取列表哈希值,这是32位哈希码的示例

int hashCode = 0;
for(Element e:list) {
   hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
}

对于多层,您可以使用另一个素数。我希望你能得到这个算法的主要思想,并且可以应用于任意的m位哈希码。