# Hashfunktion für Strings



## Thisor (25. Jan 2016)

Hello, ich überlege mir gerade eine Hashfunktion für Strings. Dabei soll jedes Wort auf einen Hashwert abgebildet werden. Hier bieten sich ja die ACSII-Werte der Buchstaben an.

Soweit bin ich bisher gekommen: 
	
	
	
	





```

```
Meine Idee:
Den String mit der Methode substring ein Buchstabe zu entziehen und den dann in ein char umwandeln und somit den ASCII-Wert zu ermitteln, wie das ganze noch als Code aussieht weiß ich noch nicht..

Was meint ihr dazu? Geht´s effizienter? Würde das überhaupt klappen? Ist substring überhaupt geeignet dafür?

Edit: 
Mal ne so ne frage:
Muss ich für ein ganzes Wort die asciiwerte ermittlen, dann modulo 26 (da 27 buchstaben -> 0-26 = 27 buckets insgesamt) und dann den Wert in den jeweiligen Bucket zuordnen?

lg


----------



## Jardcore (25. Jan 2016)

Hey Thisor,

mein Wissen zu diesen und vielen anderen Themen ist leider begrenzt. 
Aber hast du dir schon mal die hashCode()-Methode angeschaut?

```
String testString = "Die Antwort ist 42";
testString.hashCode();
```
Beste Grüße,
Jar


----------



## kneitzel (25. Jan 2016)

Also wie Jardcore schon schrieb: Es gibt bereits eine Funktion, die den Hashcode eines Strings ausrechnet.

Wenn Du aber selbst einen eigenen Hashcode berechnen möchtest, dann kannst Du Dir da gerne ein paar Dinge überlegen. Aber bitte schau dir die Funktionen der String Klasse an und rate nicht herum. So gibt es z.B. die Funktion charAt mit der Du ein einzelnes Zeichen bekommst.
Aber da Buchstaben einzeln zu verarbeiten ist evtl. auch nicht so toll. Da würde ich eher hingehen und mir ein Byte-Array ausgeben lassen. Dann hast Du eine Möglichkeit, die zu verarbeiten, z.B. immer 4 bytes zusammen als Int und diese dann per xor verknüpfen.

Konrad


----------



## Thisor (25. Jan 2016)

Oki doki, so sieht es nun bisher aus - wollte es ohne die hashMethode schreiben:

```
public class Hashing {
    public static void main(String[] args) {

        int ascii = 0;
        System.out.println("Wort eingabe: ");
        Scanner scan = new Scanner(System.in);
        String str = scan.nextLine();
        scan.close();

        char buchstabe;
        int summe = 0;
        int modulo = 13; //gibt 13 bucks

        if (str.length() > 39 || str.length() < 0) {
            System.err.println("Fehler!");
        } else {
            for (int i = 0; i < str.length(); i++) {
                buchstabe = str.charAt(i);
                ascii = (int) buchstabe;
                summe += ascii;
            }
            System.out.println("Die summe aller ascii-werte :" + summe);
            summe = summe % modulo;
            System.out.println("summe nach modulo: " + summe);
        }
    }
}
```
Wie weiße ich die Werte in die Buckets ein?
Ich würde sagen, ich erstelle 13 Arrays und mit 13 if-Anweißungen..
aber ist glaub zu viel Renudanz vorhanden??

Edit: Gut, okay ich werde wohl doch dhashcode() benutzen, so spare ich auch schon einiges


----------

