【问题标题】:Confirming file content against hash根据哈希确认文件内容
【发布时间】:2011-10-15 05:46:29
【问题描述】:

我需要“检查文件的内容的完整性”。这些文件将被写入 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);
    }
}

【问题讨论】:

    标签: java file hash checksum


    【解决方案1】:

    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
    

    【讨论】:

    • 非常感谢。我现在有我满意的工作代码(编辑成问题)。
    【解决方案2】:

    这是一个例子:

    您需要创建一个校验和文件
    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());
    

    【讨论】:

    • checksum!我知道我忘记了一个相关的术语。
    【解决方案3】:

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

    【讨论】:

    • 感谢您的 cmets。我没有想过将整个文件加载到内存中的困难。这可以通过使用 Brendan 建议的 CRC32 来解决。
    猜你喜欢
    • 2013-05-07
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    相关资源
    最近更新 更多