# Hashwert einer Datei berechnen



## Allrounder93 (19. Mrz 2014)

Moin,

ich möchte überprüfen, ob meine Datei verändert wurde... Dies soll nicht anhand des Meta-Wertes "lastChange" bestimmt werden sondern über den Hashwert der Datei... 
_Falls dies eine Rolle spielt, ich möchte an die Datei nur Meta-Werte hinzu bzw. bearbeiten und im Verzeichnis verschieben können... ohne Auswirkung auf die Datei bzw den Hashwert. 
Bearbeitet werden mehrere Zehntausenden Files_

Dazu habe ich natürlich Google befragt und einiges gefunden, doch ich werde mich der Unterschiede zur Lösung nicht bewust...

Ich habe hier im Forum eine interessante Lösung gefunden. http://www.java-forum.org/spezialthemen/16968-hashfunktionen-java-messagedigest.html
Jedoch verstehe ich nicht, wie ich ein File übergeben soll und als Rückwert den Hash-Wert bekomme :rtfm:

Gruß Chirs


----------



## Allrounder93 (19. Mrz 2014)

Sorry hab die Lösung


```
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.IOException;
import java.math.BigInteger;

public class MD5Calc {
	public static void main(String[] args) throws NoSuchAlgorithmException, FileNotFoundException {
		MessageDigest digest = MessageDigest.getInstance("MD5");
		File f = new File("c://setup.log");
		InputStream is = new FileInputStream(f);				
		byte[] buffer = new byte[8192];
		int read = 0;
		try {
			while( (read = is.read(buffer)) > 0) {
				digest.update(buffer, 0, read);
			}		
			byte[] md5sum = digest.digest();
			BigInteger bigInt = new BigInteger(1, md5sum);
			String output = bigInt.toString(16);
			System.out.println("MD5: " + output);
		}
		catch(IOException e) {
			throw new RuntimeException("Unable to process file for MD5", e);
		}
		finally {
			try {
				is.close();
			}
			catch(IOException e) {
				throw new RuntimeException("Unable to close input stream for MD5 calculation", e);
			}
		}		
	}
}
```
Quelle: http://www.javalobby.org/java/forums/t84420.html


----------



## Allrounder93 (19. Mrz 2014)

Ich habe das ganze verkleinert... Jedoch frage ich mich, kann ich das ganze "FileNotFoundException" "NoSuchAlgorithmException" "IOException" vorher abfangen bzw. dann einfach die Methode beenden?


```
@SuppressWarnings("resource")
	public static String Hash(String FilePath){						//www.javalobby.org/java/forums/t84420.html
		File f = new File(FilePath);
		byte[] buffer = new byte[8192];
		int read = 0;
		
		InputStream is = null;
		try {is = new FileInputStream(f);} catch (FileNotFoundException e1) {}
		MessageDigest digest = null;
		try {digest = MessageDigest.getInstance("MD5");} catch (NoSuchAlgorithmException e1) {}
		
			try {
				while( (read = is.read(buffer)) > 0) {
					digest.update(buffer, 0, read);
				}
			} catch (IOException e) {e.printStackTrace();}		
			
			byte[] md5sum = digest.digest();
			BigInteger bigInt = new BigInteger(1, md5sum);
			return bigInt.toString(16);
		}
```


----------



## Allrounder93 (21. Mrz 2014)

Durch ne Vorfunktion^^


----------

