8

我想实现在服务器上上传的某些文件的可恢复的即时哈希生成。这些文件很大,所以我正在使用 MessageDigest 类的 update(byte[]) 方法(如此处所述,例如:How can I generate an MD5 hash?),因为新字节来自 HttpServletRequest 的 InputStream。

一切都很顺利,但是,当我想添加可恢复的上传支持时,它变得很有趣。如果上载过早终止,则不完整的文件将存储在磁盘上。但是,控制器(和底层服务)退出,因此 MessageDigest 对象丢失。在此之前,我是否可以将 MessageDigest 对象序列化到磁盘(或 DB,没关系),这样当我再次反序列化对象时,它会记住它的临时状态,所以当我恢复上传时(从确切的它之前被终止的地方,所以没有字节是多余的,也没有一些字节丢失)并继续更新()反序列化的MessageDigest,最终我得到相同的结果(哈希),就好像文件是一次上传的一样?

4

2 回答 2

3

获取自定义 MD5 实现之一,例如this onethis one。使其可序列化或仅公开其内部状态。上传中止时保留状态,恢复上传时恢复状态。

于 2012-08-04T12:46:50.280 回答
1

哈希计算起来很便宜(MD5 加倍;你确定你不想要 SHA1 吗?)。一旦您检测到上传已恢复,我建议您从头开始重新散列所有内容。除非上传量真的很大,否则运行时间应该很短——希望大的、中断的上传量很少。

于 2012-08-02T19:46:56.467 回答