gpt4 book ai didi

java - 有效地散列目录中的所有文件(1000 个 2MB 文件)

转载 作者:行者123 更新时间:2023-12-01 14:07:39 25 4
gpt4 key购买 nike

我想对给定目录中的所有文件进行哈希 (MD5),其中包含 1000 张 2MB 照片。我尝试只运行一个 for 循环并一次对一个文件进行哈希处理,但这导致了内存问题。

我需要一种方法以有效的方式(内存方面)对每个文件进行哈希处理。

我已经针对我的问题发布了 3 个问题,但现在我不想修复我的代码,而是想看看什么是满足我的要求的最佳通用方法。

非常感谢您的帮助。

public class MD5 {

public static void main(String[] args) throws IOException {
File file = new File("/Users/itaihay/Desktop/test");
for (File f : file.listFiles()) {
try {
model.MD5.hash(f);
} catch (Exception e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.

}
}

private static MessageDigest md;
private static BufferedInputStream fis;
private static byte[] dataBytes;
private static byte[] mdbytes;

private static void clean() throws NoSuchAlgorithmException {
md = MessageDigest.getInstance("MD5");
dataBytes = new byte[8192];
}
public static void hash(File file) {
try {
clean();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
try {
fis = new BufferedInputStream(new FileInputStream(file));
int nread = 0;
while ((nread = fis.read(dataBytes)) != -1) {
md.update(dataBytes, 0, nread);
}
nread = 0;
mdbytes = md.digest(); System.out.println(javax.xml.bind.DatatypeConverter.printHexBinary(mdbytes).toLowerCase());

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fis.close();
dataBytes = null;
md = null;
mdbytes = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

最佳答案

正如其他人所说,使用内置的 Java MD5 代码,您应该能够保持内存占用非常小。在对大量 Jar 文件(每个最多几 MB,通常一次值(value) 500MB)进行哈希处理时,我会执行类似的操作并获得不错的性能。您肯定会想尝试不同的缓冲区大小,直到找到适合您的系统配置的最佳大小。以下代码片段一次使用不超过 bufSize+128 字节,加上 FileMessageDigest 的可忽略不计的开销,和用于计算 md5 哈希的 InputStream 对象:

InputStream is = null;
File f = ...
int bufSize = ...
byte[] md5sum = null;

try {
MessageDigest digest = MessageDigest.getInstance("MD5");
is = new FileInputStream(f);
byte[] buffer = new byte[bufSize];

int read = 0;
while((read = is.read(buffer)) > 0) digest.update(buffer,0,read);
md5sum = digest.digest();
} catch (Exception e){
} finally {
try{
if(is != null) is.close();
} catch (IOException e){}
}

关于java - 有效地散列目录中的所有文件(1000 个 2MB 文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18771193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com