# Hashcode-Berechnung



## JabbaJava (14. Dez 2021)

Hallo zusammen,

ich zermatere mir gerade den Kopf über folgende Aufgabe:


Eine Lösung gibt's dazu auch (Diese Funktion In.open gehört zu einer Bibliothek die der Aufgabe anhängig ist, spielt hier aber eig. keine Rolle):

```
public class A1 {   
    // Return the hash code of the given word
    static int hash(String word) {
        int code = 0;
        for (int i = 0; i < word.length(); i++) {
            code = (2 * code) ^ word.charAt(i);
            System.out.println(code);
        }
        return code;
    }
    
    public static void main(String args[]) {
        In.open("A1Input.txt");
        // Anton Berta Caesar x aVeryVeryVeryVeryVeryVeryVeryVeryLongWord
        String word = In.readWord();
        while (In.done()) {
            Out.println(word + " => " + hash(word));
            word = In.readWord();
        }
        In.close();
    }
}
```
Output:
Anton => 1536
Berta => 1609
Caesar => 3108
x => 120
aVeryVeryVeryVeryVeryVeryVeryVeryLongWord => 286334196


Ich weiß, dass Hausaufgaben ohne eigenen Ansatz hier nicht gern gesehen sind, aber ich hab einfach keinen Schimmer, wie hier dieser hash-code berechnet wird. 
Mein Problem liegt wohl vor allem im Verständnis des Exclusiven-Oder hier. 

Vielleicht könnte mir das jemand Step-by-Step erklären:

Also die Methode hash empfängt den String "Anton". 
Für jeden Buchstaben in "Anton" wird nun code = (2 * code) ^ word.charAt(i); ausgeführt:

1) code = 2 * 0 ^ *65* (ASCII für 'A') 
Also nun 0 ^ 65

Wie berechnet man nun mit dem exklusiven Oder? 

Soweit ich weiß, gibt das doch immer nur einen Wahrheitswert zurück? Also wenn sich die Werte unterscheiden dann "True" und sonst "False". 

Komm da einfach nicht hinter 

Hoffe mir kann jemand weiterhelfen!


----------



## mihe7 (14. Dez 2021)

wert = 0
wert = (wert << 1)^zeichen1
wert = (wert << 1)^zeichen2
...


----------



## temi (15. Dez 2021)

JabbaJava hat gesagt.:


> Soweit ich weiß, gibt das doch immer nur einen Wahrheitswert zurück? Also wenn sich die Werte unterscheiden dann "True" und sonst "False".


Man kann logische Verknüpfungen für einen einzelnen "Wahrheitswert" vornehmen, also die typische Wahrheitstabelle, hier für XOR:

```
0 0 = 0
0 1 = 1
1 0 = 1
1 1 = 0
```

Das ist es, was du vermutlich meinst und was z. B. in der if-Anweisung verwendet wird `if (a && b) {`.


Die logischen Verknüpfungen funktionieren allerdings auch "wortweise". Dabei werden die einzelnen Bit eines Wertes mit dem jeweils korrespondierenden Bit eines anderen Wertes logisch verknüpft, was einen neuen Wert ergibt. Hier mal mit UND:

```
00100101 Wert 1 (37d)
01100110 Wert 2 (102d)

00100100 Ergebnis (36d)
```


----------



## JabbaJava (28. Dez 2021)

Sry, hat etwas gedauert. danke fuer eure antworten. habs aber denke ich verstanden. das forum spinnt hier uebrigens gerade total


----------



## JabbaJava (28. Dez 2021)

stuerzt ab sobald ich mehr als eine zeile tippe...


----------



## kneitzel (28. Dez 2021)

Workaround bei dem Forum-Problem kann sein, dass man einfach etwas kurzes Schreibt und dies dann editiert.

Das hat zumindest bei mir funktioniert ...


----------

