2010-12-14 9 views
0

Ich verwende folgenden Code, um die Checksumme einer Datei zu erhalten. Es verwendet 50% der CPU während der Berechnungen.MD5 Checksum effizient berechnen

MessageDigest md = MessageDigest.getInstance("MD5"); 
InputStream is = new FileInputStream("C:\\Temp\\Small\\Movie.mp4"); // Size 700 MB 

byte [] buffer = new byte [blockSize]; 
int numRead; 
do 
{ 
numRead = is.read(buffer); 
if (numRead > 0) 
{ 
    md.update(buffer, 0, numRead); 
} 
} while (numRead != -1); 

byte[] digest = md.digest(); 

Was kann den Code verwenden, maximalen CPU andere als Thread.sleep (ms)

Grüßen, Kingsley Reuben J

+1

50% auf einem Single- oder Dual-Core-CPU starten könnten? :) Ich vermute, seine auf einem Dual-Core. – Quamis

+0

@Quamis Die Antwort ist also, mehr Kerne zu bekommen. –

+0

Ich habe Ihre Frage kommentiert, die Antworten finden Sie auf der Seite. Ich versuche herauszufinden, dass du falsche Daten gepostet hast. Ihr Algorithmus scheint die md5sum einer Datei zu berechnen. Dies ist eine sehr intensive CPU + Festplattenaufgabe. Also ich nehme an, dass Ihre CPU 100% sein sollte. Sie sagten 50%, was zu der Annahme führt, dass Sie ein Dual-Core-System haben, und die tatsächliche CPU-Nutzung in diesem Fall wäre 100%. – Quamis

Antwort

2

Sie könnten nutzen die Thread.setPriority(int newPriority) Methode zu reduzieren getan werden die reduzieren Thread-Priorität. Dies führt dazu, dass andere Threads mit höherer Priorität häufiger ausgeführt werden. Ihr MD5 wird jedoch nicht so schnell berechnet, als wenn Sie die Priorität allein gelassen hätten - warum sollten Sie nicht möchten, dass diese Berechnung so schnell wie möglich abgeschlossen wird?

EDIT: Hier ist ein "Fast MD5" implementation, die eine deutliche Leistungssteigerung (26% schneller im Durchschnitt) über Java-Standard java.security.MessageDigest Implementierung bietet. Ausführliche Informationen finden Sie auf der Seite des Autors, einschließlich code examples und benchmarks. Der Code ist unter der GNU LGPL 2.1 license verfügbar.

+0

Dieser Code ist in einem Servlet implementiert, um die Integrität der hochgeladenen Datei zu überprüfen. 50 bis 100 Dateien werden gleichzeitig aus einem Satz von 10k-Dateien auf den Server hochgeladen. –

0

Ich würde eher Priorität Management os widmen, für Fenster, die Sie Ihre App mit

start /low your_executable