Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 根据哈希值确认文件内容_Java_File_Hash_Checksum - Fatal编程技术网

Java 根据哈希值确认文件内容

Java 根据哈希值确认文件内容,java,file,hash,checksum,Java,File,Hash,Checksum,我要求“检查文件内容的完整性”。这些文件将写入CD/DVD,可能会被复制多次。这样做的目的是识别正确复制的副本(从Nero等处移除后) 我对这一点相当陌生,但快速搜索表明这将符合需要。我们可以在磁盘上包含一个文件,其中包含每个感兴趣资源的调用结果,然后将其与选中时从磁盘读取的文件的字节[]进行比较 我是否正确理解了该方法,这是检查文件内容的有效方法吗 如果没有,建议搜索关键字或策略/方法/类将不胜感激 工作代码基于Brendan的答案。它负责处理由VoidStar识别的问题(需要将整个字节[]

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

我对这一点相当陌生,但快速搜索表明这将符合需要。我们可以在磁盘上包含一个文件,其中包含每个感兴趣资源的调用结果,然后将其与选中时从磁盘读取的
文件的
字节[]
进行比较

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

如果没有,建议搜索关键字或策略/方法/类将不胜感激


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


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

以下是一个示例:

您需要创建一个校验和文件

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

您需要的是某种类型的错误检查代码,例如

Java恰好有一个类用于计算这些:


校验和
!我知道有一个相关的术语我忘记了。谢谢你的评论。我没有考虑将整个文件加载到内存中的困难。这可以通过使用CRC32解决,正如Brendan所建议的。非常感谢。我现在有了我满意的工作代码(编辑成问题)。
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);
    }
}
    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());
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