2010-05-22 2 views

Antwort

34

Die Mindestanforderung ist, dass der Hash-Code für jeden gegebenen Wert gleich sein sollte. Also, diese Umsetzung funktioniert, aber die Verteilung ist schrecklich:

public override int GetHashCode() { 
    return 1; 
} 

am besten funktionieren, die Hash-Codes sollten alle relevanten Daten in das Objekt betrachten und so gleichmäßig wie möglich innerhalb der Integerbereich verteilt werden.

Eine Implementierung, die alle Elemente berücksichtigt, aber keine gute Verteilung ergibt, kann in der System.Drawing.Point-Struktur gefunden werden. Es verwendet XOR die Bits in den Elementen zu kombinieren, was bedeutet, dass alle Punkte in der X und Y ist, den Hash-Code gleich Null erhalten:

public override int GetHashCode() { 
    return this.X^this.Y; 
} 

Eine Möglichkeit, eine bessere Verteilung zu erhalten, ist ein Mitglied von einem prim vervielfachen Anzahl und fügen sie das nächste Mitglied, je nach Bedarf zu wiederholen:

public override int GetHashCode() { 
    return ((this.Value1 * 251) + this.Value2) * 251 + this.Value3; 
} 

Das gleiche Verfahren in einfachen Zufallsgeneratoren verwendet wurde, da es ziemlich gut die Werte streut.

+0

Einige wirklich gute Punkte dort. Vielen Dank! – dotnetdev

Verwandte Themen