next up previous contents
Nächste Seite: Verzeichnisse verwenden Aufwärts: Hash-Funktionen Vorherige Seite: Verbesserte Hashfunktion   Inhalt

Hashwert einer Textdatei berechnen

Im folgenden Beispiel geben wir den Hashwert einer Textdatei aus. Zur Berechnung dieses Wertes versuchen wir verschiedene Rechenverfahren...

import java.io.*;

public class hash {

    static long ergebnis;

    public static void main (String[] args) {
        File f = new File(args[0]);
        int zeilenzahl = 1;     
        try {
            BufferedReader eingabe = new BufferedReader(new FileReader(f));
            String zeile = eingabe.readLine();
            while (zeile != null) {
                addiere(zeile, zeilenzahl);
                zeile = eingabe.readLine();
                zeilenzahl++;
            }
            System.out.println(ergebnis);
        }

        catch (FileNotFoundException e) {
            System.out.println("Datei --->" + args[0] + "<--- nicht gefunden :-(");
        }

        catch (IOException e) {
            System.err.println(e.toString());
        }


    }

    public static long addiere(String zeile, int zeilenzahl) {
        byte bytes[] = new byte[256];
        bytes = zeile.getBytes();
        for (int i = 0; i<bytes.length;i++) 
            ergebnis = (ergebnis ^ bytes[i]*(i+1));
        return ergebnis;
    }

}

Wir testen unsere Funktion mit der folgenden Textdatei test.text:

informatik ist schön
informatik ist schön

und erhalten den Hashwert

alfred@duron:~/java/kurs/krypto> java hash test.text
0

Jede Textdatei, die aus genau zwei (beliebigen) gleichen Textzeilen besteht liefert den gleichen Hashwert. Dies ist natürlich wenig sinnvoll - aus diesem Grund ``erweitern'' wir den Algorithmus beispielsweise folgendermaßen:

        for (int i = 0; i<bytes.length;i++) 
            ergebnis = (ergebnis ^ (bytes[i]*(i+1))) % (zeilenzahl*bytes.length);

Die Verwendung von Hash-Algorithmen, die einen möglichst eindeutigen Hashwert einer Datei bestimmen, hat eine besondere Bedeutung bei der Übertragung von Daten: Stellt man eine Datei zum Download bereit und gibt man zusätzlich ihren Hashwert an, den man mit einer bestimmten Funktion berechnet hat, so kann nach dem Download überprüft werden, ob die Daten vollständig übertragen wurden oder ob bei einem Einbruch auf den Download-Server die Originaldatei gegen eine andere Datei (z.B. Trojaner) ausgetauscht wurde. Unter Linux steht dazu beispielsweise des Algorithmus md5sum (Message Digest) zur Verfügung:

alfred@duron:~/java/kurs/krypto> md5sum test.text
a9a2e98f11bf7f9872d42a4aa5e6175f  test.text


next up previous contents
Nächste Seite: Verzeichnisse verwenden Aufwärts: Hash-Funktionen Vorherige Seite: Verbesserte Hashfunktion   Inhalt
Alfred Nussbaumer 2003-02-10