我想实现对服务器上上传的某些文件进行可恢复的即时哈希生成。这些文件很大,因此我正在动态使用 MessageDigest 类的 update(byte[]) 方法(如此处所述,例如:如何生成 MD5 哈希值?),因为新字节从 HttpServletRequest 的 InputStream 到达.
一切都很顺利,但是,当我想添加断点续传支持时,它变得很有趣。如果上传提前终止,则不完整的文件将存储在磁盘上。但是,控制器(和底层服务)退出,因此 MessageDigest 对象丢失。在此之前,我可以将 MessageDigest 对象序列化到磁盘(或数据库,没关系),这样当我再次反序列化该对象时,它会记住它的临时状态,因此当我恢复上传时(从确切的位置开始)之前终止的地方,所以没有多余的字节,也没有丢失一些字节)并继续 update() 反序列化 MessageDigest,最终我得到相同的结果(哈希),就像文件一次上传整个文件一样?
哈希值的计算成本很低(MD5 的成本加倍;您确定不需要 SHA1 吗?)。我建议您在检测到上传已恢复后立即从头开始重新进行所有操作。运行时间应该很短,除非上传确实很大——希望大的、中断的上传会很少。
BouncyCastle MD5 实现允许通过
MD5Digest.getEncodedState()
创建内部状态的字节数组。该数据可以是持久的,并且稍后使用字节数组的构造函数从中重建对象。