Подтверждение содержимого файла по хешу - PullRequest
5 голосов
/ 15 октября 2011

У меня есть требование «проверить целостность» содержимого файлов.Файлы будут записаны на CD / DVD, который может быть скопирован много раз.Идея состоит в том, чтобы идентифицировать копии (после их удаления из Nero и т. Д.), Которые были правильно скопированы.

Я довольно новичок в этом, но быстрый поиск показывает, что Arrays.hashCode(byte[]) будет соответствоватьнеобходимость.Мы можем включить на диск файл, содержащий результат этого вызова для каждого интересующего ресурса, а затем сравнить его с byte[] из File, считанным с диска при проверке.

Я понимаюметод правильно, это правильный способ проверки содержимого файла?

Если нет, то мы будем благодарны за предложения по поиску ключевых слов или стратегий / методов / классов.


РаботаКод, основанный на ответе Брендана.Он решает проблему, выявленную 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 ]

8 голосов
/ 15 октября 2011

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
1 голос
/ 15 октября 2011

Вот пример:

Вам необходимо создать файл контрольной суммы
http://www.jguru.com/faq/view.jsp?EID=216274

1 голос
/ 15 октября 2011

Да, если вы загрузите весь файл и передадите его, он будет работать как положено. Однако будет потреблять столько же ОЗУ, сколько и файл большого размера, что не нужно для этой задачи. Если вместо этого вы хэшируете файл небольшими блоками при потоковой передаче из хранилища, вы можете избежать потери памяти. Например, вы можете скомпоновать вместе хеши каждого блока, чтобы создать окончательный хеш, или найти реализацию хеша, которая ожидает потоковую передачу данных.

...