组合来自不同对象的两个哈希的可接受方法是使用XOR。这是有道理的,但正如Thomas Pornin在下面的帖子中提到的第二条评论中所提到的,XOR是可交换的,这意味着如果你对一个集合中的每个元素进行散列并将它们与XOR结合起来,那么你所做的任何顺序总是会导致相同的哈希:
Why is XOR the default way to combine hashes?
结合您希望依赖顺序的哈希的好方法是什么?如果它是特定的大小,32位和64位的一些已知技术是什么?
答案 0 :(得分:1)
为了使得到的散列顺序依赖,算法中必须有一些顺序(即非静态)方面。最常见的技术可能是Cyclic Redundancy Checks(CRC)。
CRC可以在硬件中实现为具有XOR-ed反馈的移位寄存器。这种移位寄存器用作确定性随机数发生器。如果初始状态相同,则它将始终经历相同的状态序列。这些状态用于CRC签名计算,以可重复的方式对数据进行异或。
要组合两个哈希值,您可以将它们与CRC算法中的第三个值进行异或。这可以通过查找表计算或获取.-
热门CRC代码:
09 bits (CRC-8)
17 bits (CRC-16)
33 bits (CRC-32)
65 bits (CRC-64)
Classless.Hasher提供了更多详细信息。
C#实现可以在HashLib中找到。