Discussion:
Java String.hashCode-Algorithmus
(zu alt für eine Antwort)
Bonita Montero
2019-08-26 08:09:00 UTC
Permalink
Ist der Algorithmus von hashCode für String irgenddwo dokumentiert?
Bonita Montero
2019-08-26 08:11:14 UTC
Permalink
Post by Bonita Montero
Ist der Algorithmus von hashCode für String irgenddwo dokumentiert?
Ach, hab's schon gefunden:
https://dzone.com/articles/what-is-wrong-with-hashcode-in-javalangstring
Michael Paap
2019-08-26 08:42:56 UTC
Permalink
Post by Bonita Montero
Ist der Algorithmus von hashCode für String irgenddwo dokumentiert?
Was spricht denn gegen einen Blick in den Quellcode?

/**
* Returns a hash code for this string. The hash code for a
* {@code String} object is computed as
* <blockquote><pre>
* s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
* </pre></blockquote>
* using {@code int} arithmetic, where {@code s[i]} is the
* <i>i</i>th character of the string, {@code n} is the length of
* the string, and {@code ^} indicates exponentiation.
* (The hash value of the empty string is zero.)
*
* @return a hash code value for this object.
*/
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;

for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}

Gruß
Michael Paap
Bonita Montero
2019-08-26 09:01:12 UTC
Permalink
Post by Michael Paap
Post by Bonita Montero
Ist der Algorithmus von hashCode für String irgenddwo dokumentiert?
Was spricht denn gegen einen Blick in den Quellcode?
/**
* Returns a hash code for this string. The hash code for a
* <blockquote><pre>
* s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
* </pre></blockquote>
* (The hash value of the empty string is zero.)
*
*/
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
Das ist aber was anderes als was die Doku sagt:
https://docs.oracle.com/javase/9/docs/api/java/lang/String.html#hashCode--
Michael Paap
2019-08-26 09:05:43 UTC
Permalink
Post by Bonita Montero
https://docs.oracle.com/javase/9/docs/api/java/lang/String.html#hashCode--
Der Quellcode ist aus Java 8.

Aber pssst, Geheimtip: Wenn du eine andere Version verwendest, kannst du
auch da in den Quellcode schauen. :-)

Gruß
Michael
Michael Paap
2019-08-26 09:09:58 UTC
Permalink
Post by Michael Paap
Post by Bonita Montero
https://docs.oracle.com/javase/9/docs/api/java/lang/String.html#hashCode--
Der Quellcode ist aus Java 8.
Aber pssst, Geheimtip: Wenn du eine andere Version verwendest, kannst du
auch da in den Quellcode schauen. :-)
Mal ganz davon abgesehen, dass ich da keinen Unterschied sehe.

Gruß
Michael
Bonita Montero
2019-08-26 09:33:16 UTC
Permalink
Post by Michael Paap
Post by Michael Paap
Aber pssst, Geheimtip: Wenn du eine andere Version verwendest,
kannst du auch da in den Quellcode schauen. :-)
Mal ganz davon abgesehen, dass ich da keinen Unterschied sehe.
Der Algorithmus ist ziemlich anders;
z.B. enthält er nicht wie in der Doku eine XOR-Operation.
Patrick Roemer
2019-08-26 09:53:57 UTC
Permalink
Post by Bonita Montero
Der Algorithmus ist ziemlich anders;
z.B. enthält er nicht wie in der Doku eine XOR-Operation.
| {@code ^} indicates exponentiation

Viele Grüße
Patrick
Michael Paap
2019-08-26 09:46:20 UTC
Permalink
Post by Bonita Montero
Post by Michael Paap
Post by Michael Paap
Aber pssst, Geheimtip: Wenn du eine andere Version verwendest,
kannst du auch da in den Quellcode schauen. :-)
Mal ganz davon abgesehen, dass ich da keinen Unterschied sehe.
Der Algorithmus ist ziemlich anders;
z.B. enthält er nicht wie in der Doku eine XOR-Operation.
Bitte lies noch mal, was du verlinkt hast. Da ist keine Rede von XOR.

Gruß
Michael
Bonita Montero
2019-08-26 11:05:24 UTC
Permalink
Post by Michael Paap
Post by Bonita Montero
Der Algorithmus ist ziemlich anders;
z.B. enthält er nicht wie in der Doku eine XOR-Operation.
Bitte lies noch mal, was du verlinkt hast. Da ist keine Rede von XOR.
Im Kommentar ist der Algorithmus als
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
* *
Da wo die Sternchen sind sind XORs.
Die Implementation ist zwar sinnvoll, aber weicht davon ab.
Joerg Meier
2019-08-26 11:27:06 UTC
Permalink
Post by Bonita Montero
Post by Michael Paap
Post by Bonita Montero
Der Algorithmus ist ziemlich anders;
z.B. enthält er nicht wie in der Doku eine XOR-Operation.
Bitte lies noch mal, was du verlinkt hast. Da ist keine Rede von XOR.
Im Kommentar ist der Algorithmus als
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
* *
Da wo die Sternchen sind sind XORs.
Die Implementation ist zwar sinnvoll, aber weicht davon ab.
Nein, da, wo die Sternchen sind, sind Exponenten. Das ist eine angesichts
des Themas programmiersprache zwar unglueckliche aber doch sehr verbreitete
Art, Exponenten in ASCII-7 zu notieren. Wenn Du den Kommentar mit dem
Source Code, der ja auch in dem Artikel ist, vergleichst, wirst Du auch
sehen, dass es keinen Sinn machen wuerde, wenn der Autor an dieser Stelle
XOR meinen wuerde.

Liebe Gruesse,
Joerg
--
Ich lese meine Emails nicht, replies to Email bleiben also leider
ungelesen.
Michael Paap
2019-08-26 12:17:14 UTC
Permalink
Post by Joerg Meier
Nein, da, wo die Sternchen sind, sind Exponenten. Das ist eine angesichts
des Themas programmiersprache zwar unglueckliche aber doch sehr verbreitete
Art, Exponenten in ASCII-7 zu notieren.
Das passiert da ja nicht mal einfach so, sondern es steht explizit da,
wofür die ^ stehen sollen.

Gruß
Michael
Joerg Meier
2019-08-26 15:23:21 UTC
Permalink
Post by Michael Paap
Post by Joerg Meier
Nein, da, wo die Sternchen sind, sind Exponenten. Das ist eine angesichts
des Themas programmiersprache zwar unglueckliche aber doch sehr verbreitete
Art, Exponenten in ASCII-7 zu notieren.
Das passiert da ja nicht mal einfach so, sondern es steht explizit da,
wofür die ^ stehen sollen.
Ah, ich hatte den dzone-Artikel noch mal gelesen, nicht die Javadoc.

Liebe Gruesse,
Joerg
--
Ich lese meine Emails nicht, replies to Email bleiben also leider
ungelesen.
Michael Paap
2019-08-26 12:14:33 UTC
Permalink
Post by Bonita Montero
Post by Michael Paap
Post by Bonita Montero
Der Algorithmus ist ziemlich anders;
z.B. enthält er nicht wie in der Doku eine XOR-Operation.
Bitte lies noch mal, was du verlinkt hast. Da ist keine Rede von XOR.
Im Kommentar ist der Algorithmus als
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
* *
Da wo die Sternchen sind sind XORs.
Nein. Ich hatte nicht umsonst angeregt, dass du noch mal *liest*, was du
verlinkt hast. Vielleicht versuchst du das doch mal?
Post by Bonita Montero
Die Implementation ist zwar sinnvoll, aber weicht davon ab.
Nein.

Gruß
Michael
Claus Reibenstein
2019-08-26 11:10:17 UTC
Permalink
Post by Michael Paap
Post by Bonita Montero
https://docs.oracle.com/javase/9/docs/api/java/lang/String.html#hashCode--
Der Quellcode ist aus Java 8.
Hat sich bis Java 12 auch nicht nennenswert geändert.

Gruß
Claus
Wanja Gayk
2019-09-20 14:57:37 UTC
Permalink
In article <qk042t$cj4$***@news.albasani.net>, ***@gmail.com
says...
Post by Bonita Montero
Ist der Algorithmus von hashCode für String irgenddwo dokumentiert?
Ja, im Sourcecode.
http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/cla
sses/java/lang/String.java#l1452


Gruß,
-Wanja-
--
..Alesi's problem was that the back of the car was jumping up and down
dangerously - and I can assure you from having been teammate to
Jean Alesi and knowing what kind of cars that he can pull up with,
when Jean Alesi says that a car is dangerous - it is. [Jonathan Palmer]
Lesen Sie weiter auf narkive:
Suchergebnisse für 'Java String.hashCode-Algorithmus' (Newsgroups und Mailinglisten)
11
Antworten
Wie berechnet man einen HMAC-SHA1 aus einem String?
gestartet 2006-07-25 15:38:30 UTC
de.comp.lang.java
43
Antworten
Eigenes java.lang.String verwenden
gestartet 2012-12-29 21:44:19 UTC
de.comp.lang.java
39
Antworten
Call by Ref bei Strings
gestartet 2007-04-13 23:29:46 UTC
de.comp.lang.java
44
Antworten
hashCode über Zeit eindeutig?
gestartet 2004-10-27 18:06:24 UTC
de.comp.lang.java
Suchergebnisse für 'Java String.hashCode-Algorithmus' (Fragen und Antworten)
4
Antworten
Wie sicher ist Javas hashCode ()?
gestartet 2014-03-07 13:33:28 UTC
sicherheit
7
Antworten
Wie viele Weltsamen enthält Minecraft?
gestartet 2015-07-14 14:25:59 UTC
gaming
9
Antworten
Kann man erkennen, ob eine Kennwortschätzung nahe am Hash-Ergebnis lag?
gestartet 2016-09-16 01:50:17 UTC
sicherheit
10
Antworten
Stellen zwei Zeilen kopierten Codes ein Plagiat dar?
gestartet 2017-12-07 04:48:24 UTC
wissenschaft
21
Antworten
Lehren und Missverständnisse in Bezug auf Verschlüsselung und Kryptologie
gestartet 2011-02-20 01:25:34 UTC
sicherheit
Nicht verwandte, aber interessante Themen
6
Antworten
Was ist der verantwortungsvolle Weg, eine Waffe zu verkaufen?
gestartet 2017-11-13 15:08:27 UTC
5
Antworten
Was sind die Mindestanzahl an Schuhen, die zum Wandern im Freien benötigt werden?
gestartet 2013-07-07 02:30:28 UTC
6
Antworten
Wie kann ich mein Essen verpacken, damit es nicht riecht?
gestartet 2019-08-19 05:52:32 UTC
5
Antworten
Ist es besser, bei kaltem Wetter auf dem Boden zu schlafen als auf einer Luftmatratze?
gestartet 2019-09-30 17:11:19 UTC
5
Antworten
Wie gefährlich sind Kängurus?
gestartet 2016-12-09 16:10:46 UTC
Loading...