2011-02-07 57 views
5

我正在从http服务器下载文件,并且必须考虑到在下载过程中的随机点,网络连接失败或计算机崩溃。如果发生这种情况,我使用HTTP“Range:”标题开始恢复下载。恢复下载的MD5摘要

由于下载必须通过MD5哈希来验证,似乎没有办法让我在恢复后使用网络输入流以获得正确的哈希值,因为java.security.MessageDigest似乎没有方法基本上说“从上一次下载,从这个部分md5散列开始增加当前md5散列”。

我对md5的内部不是很熟悉 - 这在理论上是可行的吗?有没有一个库让我这么做?

从下载的文件中计算md5哈希值将会严格影响性能。

+0

我加了一个“d”的称号,因为它看起来就像你在谈论的简历,如在一张纸,上面有你的工作经验 – Woot4Moo 2011-02-07 16:07:49

回答

3

您可以在将MD5提供给网络流之前,为其提供正在恢复的文件的内容。

如果您自己实现了MD5,则可以将状态保存在部分下载的文件中,并从此处恢复MD5计算。例如使用this MD5 implementation它应该像在com.twmacinta.util.MD5内保存/加载com.twmacinta.util.MD5State state一样简单。关于你的评论,请注意,本地实现是完全可选的,它应该在纯Java中工作。以下是documentation的一段引言:

此类将尝试使用本机方法在适当的本机库可用时快速计算校验和[...]如果未找到该库,代码将回退到默认(较慢)的Java代码。
+0

对不起,原来的岗位我没”不要提到jvm重启的可能性。这也必须考虑在内。 – EddyYosso 2011-02-07 16:00:32

+0

你说得对。通过查看代码,我发现你必须能够在这个摘要中坚持这个状态。谢谢。唯一困扰着这个特定库的是本地依赖项。虽然http://ostermiller.org/utils/MD5.java.html – EddyYosso 2011-02-07 20:24:32