根据哈希确认文件内容
我要求“检查文件内容的完整性”。 这些文件将写入CD / DVD,可能会多次复制。 这个想法是识别正确复制的副本(在从Nero中删除之后)。
对此更新,但快速搜索表明Arrays.hashCode(byte[])
将满足需要。 我们可以在磁盘上包含一个文件,该文件包含每个感兴趣的资源的调用结果,然后将其与检查时从磁盘读取的File
的byte[]
进行比较。
我是否正确理解了该方法,这是检查文件内容的有效方法吗?
如果没有,将赞赏关于搜索关键字或策略/方法/类的建议。
工作代码基于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