我正在做一些爱好应用程序,我需要计算分区的哈希值,我的当前代码如下所示:
public class DiskHandler {
File diskRoot;
public DiskHandler() {
diskRoot = new File("\\\\.\\C:");
}
public String calculateSHA1() {
System.out.println("sha1 hash started");
try (FileInputStream inputStream = new FileInputStream(diskRoot)) {
MessageDigest digest = MessageDigest.getInstance("SHA-1");
byte[] bytesBuffer = new byte[1024];
int bytesRead = -1;
while ((bytesRead = inputStream.read(bytesBuffer)) != -1) {
digest.update(bytesBuffer, 0, bytesRead);
}
byte[] hashedBytes = digest.digest();
return convertByteArrayToHexString(hashedBytes);
} catch (NoSuchAlgorithmException | IOException ex) {
ex.printStackTrace();
return "";
}
}
private static String convertByteArrayToHexString(byte[] arrayBytes) {
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < arrayBytes.length; i++) {
stringBuffer.append(Integer.toString((arrayBytes[i] & 0xff) + 0x100, 16).substring(1));
}
return stringBuffer.toString();
}
}
这个问题是我有一个CPU瓶颈。它使用一个CPU内核,我有一个SSD,读取速度目前是25MB / s。
有没有办法像使用ForkJoin
框架或其他东西一样获得并行哈希?
答案 0 :(得分:0)
ForkJoin
框架适用于超过IO-Bound
任务的计算绑定任务。
基本上,你有两个问题,一个是IO(读取文件),另一个是计算(计算哈希)。
您可以使用AsynchronousFileChannel,读取文件的大块,并在读取分区后计算您在不同线程中读取的分区的哈希值。
但正如@erickson在他的评论中指出的那样,你需要剖析以检查这是否会给你买任何东西。记住一点,重点不在于使两个核心变得热门,而是让程序更快。