当前位置: 首页 > 面试题库 >

使用Java为大型文件生成MD5的速度非常慢

赫连彬炳
2023-03-14
问题内容

我正在使用Java为某些文件生成MD5哈希。我需要为多个文件生成一个MD5,总大小约为1 GB。这是我的代码:

private String generateMD5(SequenceInputStream inputStream){
    if(inputStream==null){
        return null;
    }
    MessageDigest md;
    try {
        int read =0;
        byte[] buf = new byte[2048];
        md = MessageDigest.getInstance("MD5");
        while((read = inputStream.read(buf))>0){
            md.update(buf,0,read);
        }
        byte[] hashValue = md.digest();
        return new String(hashValue);
    } catch (NoSuchAlgorithmException e) {
        return null;
    } catch (IOException e) {
        return null;
    }finally{
        try {
            if(inputStream!=null)inputStream.close();
        } catch (IOException e) {
            // ...
        }
    }

}

这似乎永远存在。如何提高效率?


问题答案:

您可能要使用Fast
MD5
库。它比Java内置的MD5提供程序快得多,并且获取哈希的过程非常简单:

String hash = MD5.asHex(MD5.getHash(new File(filename)));

请注意,速度较慢也可能是由于文件I / O速度较慢所致。



 类似资料:
  • 我使用的是Guidewire开发工作室(基于IntelliJ的IDE),在处理大文本文件(~1500行及以上)时速度非常慢。我也尝试了一个开箱即用的社区IntelliJ,但遇到了同样的问题。 当我打开这些文件时,键入一个字符需要 1 秒,即使我清楚地看到使用的内存仍然足够 (1441 MB/3959 MB)。此外,如果我打开多个文件,它会迅速吸收所有内存(我只为 IntelliJ 分配 4GB)。

  • 问题内容: 我们如何在Java中生成非常大的随机数?我说的是10000位数吗?我知道我们必须使用BigInteger,但是我们该怎么做呢?做这样的事情最有效的方法是什么?请提供一个小例子。谢谢。 问题答案: 嗯,一种方法是转到Random.org并下载二进制随机文件之一。这些文件是由大气噪声生成的,因此非常随机。我在国际象棋引擎中将其用于Zobrist键。 或者你可以去 这会给你你想要的。在此示例

  • 当尝试从另一个csv文件开始创建csv文件时,我遇到了一个性能问题。原始文件的外观如下: 可能会有数百万行这样的代码,我已经发现了1.280.000行的问题。 这是算法: 读取整个数据集,1.280.000行需要800毫秒!所以问题出在这个方法上 正如您所看到的,这个方法将一个预先计算的行添加到StringBuffer中,从输入csv文件中读取每一行,从这些行中计算新的数据,最后将生成的行添加至S

  • 我们有生成PDF文档的系统(使用Ecrion引擎)。我们正在使用时代字体。现在需要文档存档,因此我们正在从PDF切换到PDF/A,并将字体从Times 更改为Times New Roman(相同的字体)。这就是问题出现的地方 - 每个PDF / A也包括使用的字体(因为PDF / A是用于存档的PDF,因此它与字体一起出现)。问题是每个文档现在都包含“Times New Roman”,“Times

  • https://github.com/yeahnoob/perl6-perf 中的代码宿主,如下所示: 在“wordpairs.txt”很小的情况下运行良好。 但是当“单词对.txt”文件大约有140,000行(每行,两个单词)时,它的运行非常非常慢。它不能自己完成,即使在运行20秒后也是如此。 它有什么问题?代码中是否有任何错误??感谢任何人的帮助! 代码(目前,2014-09-04): 运行时

  • 问题内容: 我有一个MySQL查询(Ubu 10.04,Innodb,Core i7、16Gb RAM,SSD驱动器,优化的MySQL参数): 表em_link_data有大约700万行,em_link有数千行。此查询大约需要 18秒 才能完成。但是,如果我替换子查询的结果并执行以下操作: 那么查询将在不到1毫秒的时间内运行。仅子查询在不到1毫秒的时间内运行,因此索引了列linkid。 如果我将查