0

我有 10000 到 12000 个图像文件,并且在外部存储中存在高达 800 MB 的空间。

我正在使用一个循环,它获取每个文件路径并生成它的 md5,但是由于要读取大量文件来创建 md5,这需要很多时间。

这是生成文件md5的算法。

public static String getMd5OfFile(String filePath) {

    String returnVal = "";

    try {

        InputStream input = new FileInputStream(filePath);

        // byte[] buffer  = new byte[1024];
        byte[] buffer = new byte[2048];

        MessageDigest md5Hash = MessageDigest.getInstance("MD5");

        int numRead = 0;
        while (numRead != -1) {
            numRead = input.read(buffer);
            if (numRead > 0) {
                md5Hash.update(buffer, 0, numRead);
            }
        }

        input.close();

        byte[] md5Bytes = md5Hash.digest();

        for (int i = 0; i < md5Bytes.length; i++) {
            returnVal += Integer.toString((md5Bytes[i] & 0xff) + 0x100, 16).substring(1);
        }                
    } catch (Throwable t) {
        t.printStackTrace();
    }

    return returnVal.toUpperCase();
}

所以问题是我可以增加缓冲区大小以使操作更快,我应该做多少,这不会破坏操作或产生 md5 的生成问题。

并且将缓冲流包装在输入流中会使其更快吗?

4

1 回答 1

0

与任何优化问题一样,您应该衡量您的性能,以了解您所做的任何更改是否会产生影响。

2k 当然是一个小的缓冲区大小,更大的缓冲区可以做得更好。但是 I/O 堆栈一直都有缓冲区,因此它的影响可能可以忽略不计。尝试并衡量自己。

另一个值得尝试的优化是注意读取文件是一个 I/O-bound 操作,计算 MD5 是 CPU-bound。让一个线程读取文件内容,另一个线程只更新 MD5 状态。根据设备上 CPU 内核的数量,您可以并行散列多个文件并提高性能。

于 2019-05-03T10:14:12.273 回答