2

组合来自不同对象的两个哈希值的一种公认方法是使用 XOR。这是有道理的,但正如 Thomas Pornin 在下面的帖子中的第二条评论中所提到的,XOR 是可交换的,这意味着如果您对集合中的每个元素进行哈希处理并将它们与 XOR 组合,那么您执行的任何顺序都将始终导致相同的哈希:

为什么 XOR 是组合哈希的默认方式?

什么是组合您希望依赖于顺序的哈希的好方法?如果它特定于大小,那么 32 位和 64 位的一些已知技术是什么?

4

1 回答 1

1

为了使生成的哈希顺序相关,算法中必须有一些顺序(即非静态)方面。最常见的技术可能是循环冗余校验 (CRC)。

CRC 可以在硬件中实现为具有 XOR 反馈的移位寄存器。这种移位寄存器充当确定性随机数发生器。如果初始状态相同,它将始终经历相同的状态序列。这些状态用于 CRC 签名计算,以可重复的方式异或数据。

要组合两个哈希值,您可以将它们与来自 CRC 算法的第三个值进行异或。这可以从查找表中计算或获取。-

流行的CRC码:

09 bits (CRC-8)
17 bits (CRC-16)
33 bits (CRC-32)
65 bits (CRC-64)

Classless.Hasher提供了更多细节。

C# 实现可以在HashLib中找到。

于 2013-01-02T09:47:10.077 回答