根据哈希确认文件内容

我要求“检查文件内容的完整性”。 这些文件将写入CD / DVD,可能会多次复制。 这个想法是识别正确复制的副本(在从Nero中删除之后)。

对此更新,但快速搜索表明Arrays.hashCode(byte[])将满足需要。 我们可以在磁盘上包含一个文件,该文件包含每个感兴趣的资源的调用结果,然后将其与检查时从磁盘读取的Filebyte[]进行比较。

我是否正确理解了该方法,这是检查文件内容的有效方法吗?

如果没有,将赞赏关于搜索关键字或策略/方法/类的建议。


工作代码基于Brendan的答案。 它处理由VoidStar识别的问题(需要在内存中保存整个byte[]以获取哈希值)。

 import java.io.File; import java.io.FileInputStream; import java.util.zip.CRC32; class TestHash { public static void main(String[] args) throws Exception { File f = new File("TestHash.java"); FileInputStream fis = new FileInputStream(f); CRC32 crcMaker = new CRC32(); byte[] buffer = new byte[65536]; int bytesRead; while((bytesRead = fis.read(buffer)) != -1) { crcMaker.update(buffer, 0, bytesRead); } long crc = crcMaker.getValue(); // This is your error checking code System.out.println("CRC code is " + crc); } } 

Arrays.hashCode()设计得非常快(在哈希表中使用)。 我强烈建议不要将它用于此目的。

你想要的是某种错误检查代码,如CRC 。

Java碰巧有一个用于计算这些的类: CRC32 :

 InputStream in = ...; CRC32 crcMaker = new CRC32(); byte[] buffer = new byte[someSize]; int bytesRead; while((bytesRead = in.read(buffer)) != -1) { crcMaker.update(buffer, 0, bytesRead); } long crc = crcMaker.getValue(); // This is your error checking code 

是的,只要您加载整个文件并将其传入,它就会按预期执行。 但是,它会消耗尽可能多的RAM,因为文件很大,这对于此任务来说不是必需的。 如果您在将文件从存储中流式传输时将文件散列为较小的块,则可以避免浪费内存。 例如,您可以将每个块的哈希值组合在一起以创建最终哈希值,或者找到期望数据流式传输的哈希实现。

这是一个例子:

您需要创建校验和文件
http://www.jguru.com/faq/view.jsp?EID=216274