Erstellen hash von string und int
Ich erinnere mich an eclipse und Idee haben, diese Vorlage erzeugt automatisch ein Objekt die hashCode auf Basis seiner Attribute.
Die Strategien, die, wenn eine Zahl und ein string verwendet wird, ist so etwas wie dieses.
return stringValue.hashCode() + intValue * 32;
Ooor sowas.
Habe ich nicht noch eclipse oder eine Idee an der hand und ich würde gern solche Funktion.
BEARBEITEN
Basierend auf den Antworten, die ich erstellen mit diesem mini-Klasse
class StringInt {
private final String s;
private final int i;
static StringInt valueOf( String string , int value ) {
return new StringInt( string, value );
}
private StringInt( String string, int value ) {
this.s = string;
this.i = value;
}
public boolean equals( Object o ) {
if( o != null && o instanceof StringInt ){
StringInt other = ( StringInt ) o;
return this.s == other.s && this.i == other.i;
}
return false;
}
public int hashCode() {
return s != null ? s.hashCode() * 37 + i : i;
}
}
Diese Klasse ist zur Verwendung als Schlüssel für eine große Speicher Karte ( > 10k Elemente ) ich will nicht zu Durchlaufen, Sie jedes mal zu finden, wenn der String und int sind die gleichen.
Danke.
ps.. mmh wahrscheinlich sollte es werden Namen StringIntKey.
In Ihrem equals-Methode vergleicht die Zeichenfolge, verwenden Sie equals statt ==.
InformationsquelleAutor OscarRyz | 2009-07-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwendung der Apache Commons HashcodeBuilder:
Link hier:
http://commons.apache.org/lang/api-2.3/org/apache/commons/lang/builder/HashCodeBuilder.html
Und hier:
http://www.koders.com/java/fidCE4E86F23847AE93909CE105394B668DDB0F491A.aspx
es sagt: string.hashCode * 37 + intValue!! genug für mich !! Danke
InformationsquelleAutor Jon
Eclipse tut immer ungefähr die gleiche Hash-Funktion, hier ein Beispiel für eine Klasse mit ein in und als String-Felder
Sie immer pick 31 wie der prime, und dann mehrere von bauen in der hash-Funktionen, oder der Wert, wenn Ihr ein primitiv. So etwas wäre nicht schwer zu erstellen als eine Methode.
InformationsquelleAutor Patrick Auld
Oder, wenn Sie nicht möchten, hinzufügen einer anderen Bibliothek, ist etwas wie die folgende:
es ist einfacher zu schreiben Sie einfach "return (myString + myInteger).hashCode()". Der Java-compiler kompiliert diese auf die äquivalente Folge von StringBuilder.append-Aufrufe.
eine andere Sache, wenn Sie wirklich besorgt über die Geschwindigkeit, die dieser Ansatz ist deutlich langsamer als die Berechnung und Kombination von Komponenten-hashcodes.
hashCode sollte schnell sein, es wäre viel besser, der string ist hashCode und nicht eine einfache integer-math-operation mit der Ganzzahl.
Geschwindigkeit betrifft, sind wohl wahr, aber ich habe nie bemerkt, eine deutliche Verlangsamung der Verwendung dieser Methode in der code, den wir schreiben. In der Regel unsere Leistung betrifft eher mit wire-transfer oder Algorithmus-änderung.
InformationsquelleAutor aperkins
Einen hashcode-Methode ist etwas, das potentiell viele Male aufgerufen werden, und daher lohnt sich die Optimierung. Wenn die Berechnung kompliziert ist, betrachten memoizing der hash-Wert. Vermeiden Sie auch Dinge zu tun, die bringen mehr Berechnung, als notwendig ist. (Zum Beispiel, die StringBuilder-Lösung, verbringt den Großteil Ihrer Zeit mit der Erstellung der temporären String.)
Die andere Sache, die ich hinweisen will, ist, dass die Qualität der hash ist wichtig. Sie wollen vermeiden hashcode-Algorithmus, dass in den Karten viele gemeinsame Schlüssel. Wenn das passiert, hash-Tabelle lookup möglicherweise nicht mehr O(1). (Im schlimmsten Fall O(N) ... also äquivalent zu einer linearen Suche!). Hier ist ein Beispiel für eine schlechte hash-Funktion:
Überlegen, was passiert, wenn ein element der
this.values
ist null ...InformationsquelleAutor Stephen C
Weiter, um Ihre jüngsten zu Bearbeiten, wenn die retrieval-Geschwindigkeit ist wichtiger als die Lagerung betrifft, Sie könnten vorab berechnen und speichern der hash code, der beim Bau Ihres
StringInt
Klasse. Dies ist sicher, da Sie ' ve markiert dieString
undint
Felder alsfinal
, und auch, dassString
unveränderlich ist.Außerdem könnten Sie die Optimierung Ihrer
equals
Methode, indem Sie prüfen, dass das Objekt im Vergleich ==this
bevor Sie einen vollständigen Vergleich. Ich würde auch empfehlen die billiger int-Vergleich basiert, zuerst bevor vergleichen von string-Feldern.Anderen final Vorschlag: Sie könnte sich ändern, Ihre
valueOf(String, int)
Verfahren entweder konstruieren eineStringInt
oder Rückgabe einer zuvor erstellten Instanz, wenn bereits eine existiert, die den gleichenString
- und int-Werte. Dies macht den Bau zwar teurer, aber Vergleiche sehr Billig, wie vergleichen SieStringInt
s mit "==" in dem wissen, dass keine zweiStringInt
s jemals erstellt werden mit den gleichenString
undint
Wert.InformationsquelleAutor Adamski
Können Sie auch
Objects
Klasse ausjava.util.Objects
Paket schnell bekommen hash-code.InformationsquelleAutor Puneeth Reddy V