合并多个文件的MD5哈希值

时间:2012-12-03 04:50:17

标签: c# hash md5

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

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

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

5 个答案:

答案 0 :(得分:5)

你为什么不:

  • 生成7个MD5哈希值(这是您现在正在执行的操作),然后是
  • 将这7个哈希输出组合成一个更大的字节数组和MD5哈希值,以产生一个整体哈希值。 (每个MD5哈希值为16个字节,因此最终会得到一个112字节的数组,您将对其进行哈希处理以获得整体哈希值。)

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

答案 1 :(得分:3)

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

但是,我不建议这样做,因为你会打开自己的微妙错误,例如:

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,然后定期将文件与缓存的哈希值进行比较,然后在发现差异时启动传输。

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

XOR他们都是。

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

答案 4 :(得分:0)

我知道这是在左侧字段之外,但您只需检查所有文件的Archive属性,如果任何文件设置了此标志,则文件已经以某种方式更改。

然后你可以继续创建一个哈希,如果没有,甚至不用担心首先生成哈希。

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

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