2017-01-13 83 views
0

我写了下面的程序作为一个快速实验使用他们的MD5哈希斯卡拉文件散列

import java.nio.file.{Files, Paths} 
import java.security.MessageDigest 

object Test { 

    def main(args: Array[String]) = { 

    val startTime = System.currentTimeMillis(); 
    val byteArray = Files.readAllBytes(Paths.get("/Users/amir/pgns/bigPGN.pgn")) 
    val endTime = System.currentTimeMillis(); 
    println("Read file into byte " +byteArray+ " in " + (endTime - startTime) +" ms"); 

    val startTimeHash = System.currentTimeMillis(); 
    val hash = MessageDigest.getInstance("MD5").digest(byteArray) 
    val endTimeHash = System.currentTimeMillis(); 
    System.out.println("hashed file into " +hash+ " in " +(endTime - startTime)+ " ms"); 
    } 
} 

进行重复数据删除的文件,我注意到,当我的PGN文件大约为1.5 GB的文本数据,它大约需要2.5秒来读取文件,2.5秒来散列它。

我的问题是,如果我有大量的文件,是否有更快的方法来做到这一点?

回答

1

是的,不要将所有文件读入内存!下面是一些在理论上应该会更快,虽然我没有在

import java.security.{MessageDigest, DigestInputStream} 
import java.io.{File, FileInputStream} 

// Compute a hash of a file 
// The output of this function should match the output of running "md5 -q <file>" 
def computeHash(path: String): String = { 
    val buffer = new Array[Byte](8192) 
    val md5 = MessageDigest.getInstance("MD5") 

    val dis = new DigestInputStream(new FileInputStream(new File(path)), md5) 
    try { while (dis.read(buffer) != -1) { } } finally { dis.close() } 

    md5.digest.map("%02x".format(_)).mkString 
} 

任何巨型文件,以测试这个如果一切行为与我认为它应该,这样就避免了持有到内存中的所有字节 - 为它读取块,它将它们直接消耗到散列中。请注意,您可以增加缓冲区大小以使事情变得更快......

+0

这种方法似乎可以减少我盒子上的总时间50%!很酷,谢谢。 –