多线程文件摘要

时间:2016-03-04 23:01:19

标签: java multithreading hash digest fork-join

我正在做一些爱好应用程序,我需要计算分区的哈希值,我的当前代码如下所示:

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框架或其他东西一样获得并行哈希?

1 个答案:

答案 0 :(得分:0)

ForkJoin框架适用于超过IO-Bound任务的计算绑定任务。

基本上,你有两个问题,一个是IO(读取文件),另一个是计算(计算哈希)。

您可以使用AsynchronousFileChannel,读取文件的大块,并在读取分区后计算您在不同线程中读取的分区的哈希值。

但正如@erickson在他的评论中指出的那样,你需要剖析以检查这是否会给你买任何东西。记住一点,重点不在于使两个核心变得热门,而是让程序更快。