我是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();
它们不应该生成相同的哈希值吗?
然而,这个问题更通用。第一段代码是将文件分块加载到内存中并在while循环内执行我们想要执行的任何操作(socket发送、加密文件等)的正确方式吗? 这个问题很有用,因为我看过的每个教程都是一次性加载所有内容...
更新:工作正常 :-D。通过socket分块发送文件这种方法是否能正常工作?