2017-01-13 1 views
0

Я написал следующую программу в качестве быстрого эксперимента дедупликации файлов, используя их MD5 хэшScala файл хеширования

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 Гб текстовых данных, это занимает около 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% на моей коробке! Хорошо, спасибо. –

Смежные вопросы