如何提高多个文件的md5生成速度?

How to increase speed of generating md5 of multiple files?

我有 10000 到 12000 个图像文件,并且 space 外部存储空间最多为 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 造成问题。

在输入流中包装缓冲流是否会使其更快?

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

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

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