Die JDK-Dokumentation für java.lang.String.hashCode()
famously sagt:Beweis: Warum stimmt die Implementierung von java.lang.String.hashCode() mit ihrer Dokumentation überein?
Der Hash-Code für ein String-Objekt wird wie folgt berechnet
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
int
Arithmetik, wos[i]
das ist *i
* te Zeichen der Zeichenkette,n
ist die Länge der Zeichenfolge und^
zeigt die Potenzierung an.
Die Standardimplementierung dieses Ausdrucks ist:
int hash = 0;
for (int i = 0; i < length; i++)
{
hash = 31*hash + value[i];
}
return hash;
Mit Blick auf das ich mich das Gefühl wie war meine Algorithmen natürlich schlafen durch. Wie übersetzt sich dieser mathematische Ausdruck in den obigen Code?
RE dein erster Satz: Hast du einige Beweise gesehen, dass die Frage oder eine bestimmte Antwort xor angenommen hat? –
Sie hatten sich darüber geärgert, wie der Code und die Dokumentation gleichwertig sein könnten. Da in der Dokumentation "^" für die Potenzierung verwendet wurde, wird in Java normalerweise bitweises x verwendet, oder ich fragte mich, ob dies die Ursache für Ihre Verwirrung war. (Es gab keine anderen Antworten, als ich anfing, meine Antwort zu schreiben, BTW) –
Ahh, ich verstehe. Nein, mir war bewusst, dass es eine Potenzierung war, aber unklar, wie die Implementierung aus dem mathematischen Ausdruck folgte. Ihre Antwort verdeutlicht das sehr - aber zu wissen, diesen Code nur mit diesem Ausdruck zu schreiben, ist immer noch ein Sprung für mich. Um zu diesem Code zu kommen, müsste man ein kleines Beispiel schreiben, um zu erkennen, dass man in der innersten Verschachtelung "mit 0 auf intelligente Weise multiplizieren" kann, um das Muster zu vervollständigen und dann die Schleife zu bilden. –