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

时间:2019-05-03 10:05:34

标签: android buffer md5-file

我有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。

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

1 个答案:

答案 0 :(得分:0)

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

2k当然是较小的缓冲区,而较大的缓冲区可能会做得更好。但是I / O堆栈的缓冲区一直向下,因此影响可能微不足道。尝试衡量自己。

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