7

我有 7 个要为其生成 MD5 哈希的文件。哈希用于确保数据存储的远程副本与本地副本相同。不幸的是,这两个数据副本之间的链接速度慢得令人麻木。对数据的更改非常少见,但我要求始终(或尽快)同步数据。我不想在我的(非常慢的)通信链路上传递 7 个不同的 MD5 散列,而是为每个文件生成散列,然后将这些散列组合成一个散列,然后我可以传输该散列,然后重新计算/用于比较在远端。如果“组合哈希”不同,那么我将开始发送 7 个单独的哈希以确定哪些文件已被更改。例如,

0709d609d69385255c496436eb50402c
709465a74411bd596595c7b9b158ae6a
4ab657320ef33e3d5eb498e4c13d41b7
3b49c6ab199994fd776bb63761414e72
0fc28c5a010fc3c06c0c930c88e31a15
c4ecd214662cac5aae0e53f6f252bf0e
8b086431e43148a2c2d943ba30d31cc6

我想将这些散列组合在一起,以便获得一个唯一值(可能是另一个 MD5 散列?),然后我可以将其发送到远程系统。然后,在远程系统上,我将执行相同的计算以确定整个数据是否已更改。如果有,那么我将开始发送单个哈希等。最重要的因素是我的“组合哈希”足够短,因此它使用的带宽比首先发送所有 7 个哈希要少。我想将 7 个 MD5 哈希值写入文件,然后对该文件进行哈希处理,但有更好的方法吗?

4

5 回答 5

6

你为什么不:

  • 生成 7 个 MD5 哈希(这就是你现在正在做的),然后
  • 将这 7 个哈希输出组合成一个更大的字节数组和 MD5 哈希,以产生一个整体哈希。(每个 MD5 散列是 16 个字节,因此您最终将得到一个 112 字节的数组,您将对其进行散列以获得整体散列)。

如果您的整体哈希与另一端匹配,则无需执行任何操作。如果没有,那么您开始发送中间的 7 个哈希来计算哪些文件已更改。

于 2012-12-03T05:49:32.773 回答
4

您可以计算连接在一起的所有七个文件的内容的哈希值。

但是,我不建议这样做,因为您会发现一些细微的错误,例如:

file1: 01 02 03 04 file2: 05 06 07 08

将哈希相同

file1: 01 02 file2: 03 04 05 06 07 08

你的通讯链接有多慢?单个 MD5 哈希为 32 个字节。

其中 7 个小于 1/4 KB;那只是没有多少数据。

文件将在链接的哪一侧更改?

您可以在该端缓存一组 MD5,然后定期将文件与缓存的哈希值进行比较,然后在发现差异时开始传输。

于 2012-12-03T05:00:43.237 回答
2

XOR商场。

据我所知,这是最简单有效的解决方案。

于 2012-12-03T05:21:35.593 回答
1

另一种选择是首先生成单个哈希 - 请参阅https://stackoverflow.com/a/15683147/188926

此示例迭代文件夹中的所有文件,但您可以迭代文件列表。

于 2013-03-28T13:31:00.183 回答
0

我知道这超出了左侧字段,但您可以简单地检查所有文件的存档属性,如果任何文件设置了此标志,则该文件已以某种方式更改。

然后,您可以继续创建散列,如果没有,甚至不必首先生成散列。

如果设置了存档属性,则生成哈希、同步文件并取消设置存档属性。

那将是我建议的解决方案。

于 2012-12-03T06:22:24.300 回答