Hashcode-Berechnung

JabbaJava

Mitglied
Hallo zusammen,

ich zermatere mir gerade den Kopf über folgende Aufgabe:
1639515586099.png

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):
Java:
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!
 

temi

Top Contributor
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:
Code:
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:
Code:
00100101 Wert 1 (37d)
01100110 Wert 2 (102d)

00100100 Ergebnis (36d)
 

JabbaJava

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

kneitzel

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

Das hat zumindest bei mir funktioniert ...
 

Neue Themen


Oben