Я немного новичок в Java и пытаюсь выполнить вычисление MAC для файла. Теперь, поскольку размер файла неизвестен во время выполнения, я не могу просто загрузить весь файл в память. Поэтому я написал код, чтобы он читался битами (в данном случае 4k). Проблема, с которой я столкнулся, заключается в том, что я попытался загрузить весь файл в память, чтобы увидеть, создают ли оба метода один и тот же хеш. Однако кажется, что они производят разные хеши.
Вот побитовый код:
FileInputStream fis = new FileInputStream("sbs.dat");
byte[] file = new byte[4096];
m = Mac.getInstance("HmacSHA1");
int i=fis.read(file);
m.init(key);
while (i != -1)
{
m.update(file);
i=fis.read(file);
}
mac = m.doFinal();
А вот подход «все сразу»:
File f = new File("sbs.dat");
long size = f.length();
byte[] file = new byte[(int) size];
fis.read(file);
m = Mac.getInstance("HmacSHA1");
m.init(key);
m.update(file);
mac = m.doFinal();
Разве они не должны генерировать один и тот же хеш?
Но вопрос в другом. общий. Является ли 1-й код правильным способом загрузки файла в память по частям и выполнения того, что мы хотим делать внутри цикла while? (отправка сокета, шифрование файла и т. д.). Этот вопрос полезен, потому что каждый учебник, который я видел, просто загружает все сразу ...
Обновление: Работает :-D. Будет ли этот подход работать правильно при отправке файла по частям через сокет?