2017-01-13 84 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%!很酷,謝謝。 –