| 

.NET C# Java Javascript Exception

2
Hallo! Es gibt ja die Methode GetHashCode an object, die man überschreiben kann. Wann überschreibe ich die denn überhaupt, und wie? Wie berechne ich einen sinnvollen HashCode für ein beliebiges Objekt? Gibt es dafür irgendwelche Regeln?
News:
21.05.2011
Winfried Bono 31 2
2 Antworten
1
Mit Hashcodes versucht man eine Ordung der Objekte aufzubauen, um die binäre Suche zu unterstützen. Bei einer optimalen Verteilung der Hashcodes ist der Suchaufwand im besten Fall log2(n), d.h. bei 2 hoch 10 Objekten sind maximal 10 Schritte bis zum gesuchten Objekt zu gehen. Sollten unterschiedliche Objekte gleiche Hashcodes aufweisen, ist dies nicht tragisch, sondern nur inperformanter, weil bei gleichem Hashcode die entsprechenden Objekte direkt verglichen werden müssen. Deshalb sollten Hashcodes kollisionssicher sein.

Die Gleichverteilung der Hashcodes hilft bei der Ausbalancierung der binären Bäume. Üblicherweise wird versucht ausbalancierte binäre Bäume zu bekommen, um die maximale Geschwindigkeit der binären Suche zu erreichen. Das Ausbalancieren geschieht durch einen Algorithmus, der bei besserer Gleichverteilung weniger zu tun hat, um die optimalen Cluster zu ermitteln.

Im Endeffekt geht es nur um Geschwindigkeit.

Im Zweifel ist die Fail-Save-Implementation "return 1;". Von der Geschwindigkeit wird man sich dann in dem Bereich normaler Listen bewegen, was natürlich die Verwendung von Maps und Sets ad absurdum führt. Es ist aber zur Fehleranalyse (um Hashcodes als Fehlerquelle auszuschließen) ein sinnvolles Substitut. Fehlerquellen sind z.B. Klassenattribute, die zur Berechnung von Hashcode herangezogen werden, die sich im Laufe des Lebens eines Objektes ändern können. Es ist äußerst ungünstig und fehlerträchtig, wenn sich der Hashcode eines Objektes ändert. Meine Empfehlung ist grundsätzlich Hashcodes auf Grundlage nicht veränderbarer Attribute zu berechnen. Ich benutze für persistente Objekte grundsätzlich Klassenname und eine ID von einem DB-Sequenzer.

Doppelte Hashcodes sind unproblematisch. Es ist aber genau eine Sache zu beachten:

ZWEI OBJEKTE, DIE SEMANTISCH GLEICH SEIN SOLLEN MÜSSEN DENSELBEN HASHCODE HABEN.

Diese Aussage ist auch in dem Zusammenhang zu sehen, dass man keinen Hashcode berechnet auf Grundlage veränderbarer Attribute.
23.05.2011
oopexpert 455 1 8
0
Hier bei Stackoverflow ist das schön erklärt: Why is it important to override GetHashCode when Equals method is overriden in C#?
Die Erklärung bezieht sich nicht nur unbedingt auf .NET (da du keine Programmiersprache angegeben hast).
21.05.2011
Martin Fuchs 1,4k 9
Da wird zwar erklärt, wie man das macht - aber warum das jetzt auf genau die Art sinnvoll ist, erschließt sich mir zumindest nicht.

Welche Anforderungen muss so ein Hashcode denn erfüllen? So in Bezug auf gleichverteilt, kollisionssicher, ...? Dazu wären ein paar Infos nett ;-)
Golo Roden 22.05.2011

Stelle deine Objekt-Frage jetzt!