有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java根据哈希确认文件内容

我需要“检查文件内容的完整性”。这些文件将写入CD/DVD,可能会被复制多次。这样做的目的是识别正确复制的副本(从Nero等处移除后)

我对这一点相当陌生,但快速搜索表明^{}将满足需要。我们可以在磁盘上包含一个文件,其中包含对每个感兴趣的资源调用的结果,然后将其与选中时从磁盘读取的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);
    }
}

共 (3) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    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
    
  3. # 3 楼答案

    以下是一个例子:

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

        FileInputStream file = new FileInputStream(args[0]);
        CheckedInputStream check = 
          new CheckedInputStream(file, new CRC32());
        BufferedInputStream in = 
          new BufferedInputStream(check);
        while (in.read() != -1) {
            // Read file in completely
        }
        in.close();
        System.out.println("Checksum is " + 
          check.getChecksum().getValue());