多个文件的MD5哈希值合并

8
我有7个文件需要生成MD5哈希值,这些哈希值用于确保远程数据存储的副本与本地副本完全相同。不幸的是,这两个数据存储副本之间的链接非常缓慢。虽然数据更改很少,但我有一个要求,即数据始终(或尽快)同步。为了避免在极慢的通信链路上传输7个不同的MD5哈希值,我想为每个文件生成哈希值,然后将这些哈希值组合成一个单一的哈希值来进行传输,然后在远程端重新计算/使用比较。如果“组合哈希”不同,则开始发送7个单独的哈希值,以确定哪些文件已更改。例如,以下是上周7个文件的MD5哈希值:
0709d609d69385255c496436eb50402c
709465a74411bd596595c7b9b158ae6a
4ab657320ef33e3d5eb498e4c13d41b7
3b49c6ab199994fd776bb63761414e72
0fc28c5a010fc3c06c0c930c88e31a15
c4ecd214662cac5aae0e53f6f252bf0e
8b086431e43148a2c2d943ba30d31cc6

我想将这些哈希值组合在一起,使其成为一个单独的唯一值(也许是另一个MD5哈希值)。我可以把它发送到远程系统。在远程系统上,我将执行相同的计算以确定数据整体是否已更改。如果是,那么我将开始发送各个哈希值等。最重要的因素是我的“组合哈希”要足够短,以便使用的带宽比仅在第一次发送所有7个哈希值时少。我考虑过将7个MD5哈希值写入文件,然后对该文件进行哈希处理,但是否有更好的方法?

它应该可以工作,只需确保本地和远程系统之间哈希的顺序相同即可。 - Martheen
5个回答

7
为什么不这样做:
1.生成7个MD5哈希值(这是您现在正在做的),然后
2.将这7个哈希输出组合成一个更大的字节数组,并对其进行MD5哈希以产生总体哈希值。(每个MD5哈希值为16个字节,因此您最终会得到一个112个字节的数组,您将对其进行哈希以获得总体哈希值)。
如果您的总体哈希与另一端匹配,则无需执行任何操作。如果不匹配,则开始发送您的中间7个哈希值,以确定哪些文件已更改。

5
你可以对这七个文件的内容进行连接并计算哈希值。
然而,我不建议这样做,因为这会让你暴露于一些微妙的错误中,比如:
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哈希值,然后定期将文件与缓存的哈希值进行比较,当你注意到差异时启动传输。


信不信由你,我的通讯连接是一个1200 bps调制解调器(大约150字节/秒)。这就是为什么我希望在绝大多数情况下只传输单个MD5。 :-) - bmt22033
1
我还记得1200 bps的调制解调器 ;-)然而,这仍然不到2秒钟就可以传输七个MD5;如果你压缩它们,时间会更短。 - Marshall Clow

3

XOR它们所有。

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


2

0

我知道这有点突然,但你可以简单地检查所有文件的存档属性,如果任何文件设置了此标志,则表示文件已发生更改。

然后,您可以继续创建哈希,如果没有,请不要在第一次生成哈希时打扰它。

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

这是我的建议解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接