Не удается поместить файл в массив байтов - PullRequest
0 голосов
/ 03 июля 2018

Я работаю над кодом Java, который генерирует контрольную сумму для данного файла. Я использую библиотеку Гуавы Гоголе для хеширования. Вот код -

import com.google.common.hash.HashCode;
import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;

private HashCode doHash(File file) throws IOException {
    HashFunction hc = Hashing.murmur3_128();
    HashCode hsCode = hc.newHasher().putBytes(com.google.common.io.Files.asByteSource(file).read()).hash();
    return hsCode;
}

Я запустил этот код для файла размером 2,8 ГБ. Выкинул следующую ошибку -

Exception in thread "main" java.lang.OutOfMemoryError: 2945332859 bytes is too large to fit in a byte array
    at com.google.common.io.ByteStreams.toByteArray(ByteStreams.java:232)
    at com.google.common.io.Files$FileByteSource.read(Files.java:154)
    ...

Есть ли другая структура данных, которую я могу использовать здесь? Или я должен искать другую стратегию для подачи файла в хэш-функцию?

1 Ответ

0 голосов
/ 03 июля 2018

HashFunctions Гуавы не знают, как обращаться с ByteSources. Но ByteSources знают, как обращаться с HashFunctions. Просто сделай это так.

HashCode hsCode = Files.asByteSource(file).hash(hc);
...