2010-11-22 12 views
0

Ich habe eine Klasse, in der ich Equals basierend auf zwei Uint-Werten überschrieben habe. Da ich Equals überschrieben habe, muss ich GetHashCode überschreiben.Was ist die beste Methode, zwei uints zu einem int zu kombinieren, um GetHashCode() zu überschreiben?

Der eine Uint-Wert repräsentiert eine ID, die niemals ein Duplikat haben sollte. Es ist nicht unbedingt ein automatisch inkrementierender int-Wert, sollte aber in den meisten Fällen sein. Der zweite Wert von uint stellt ein Typfeld für das Objekt dar.

Verwenden Sie nur das ID-Feld sollte genug sein. In einigen Fällen könnte es jedoch ein wenig restriktiv sein, weshalb ich die ID und den Typ kombinieren wollte.

Ich dachte daran, die zwei Zahlen zusammen zu addieren und dann die höherwertigen Bits mit den niederwertigen Bits mittels XOR zu kombinieren.

Irgendwelche anderen Ideen?

+0

Kann die 'uint ID' Feld wirklich die ganze Bandbreite der' uint' besetzen? – Ani

+0

Wir sollten es ja erlauben. – uriDium

+0

* Aber es könnte in einigen Fällen ein wenig restriktiv sein * - Können Sie etwas mehr darüber erklären, wo die Fälle sind, wo nur das ID-Feld zu restriktiv für Sie ist? –

Antwort

2

Der Hash-Code wird nur zum Verteilen von Elementen in Hash-basierten Sammlungen wie Dictionary verwendet. Daher sollte der Hash-Code idealerweise möglichst wenige Kollisionen erzeugen.

Die Mindestanforderung ist jedoch nur, dass der Hash-Code für einen gegebenen Satz von Werten immer gleich sein sollte. Daher ist auch dies ein gültiger Hash-Code-Algorithmus:

Obwohl es eine schreckliche Verteilung gibt, ist es immer noch funktionsfähig.

Wenn Sie sowohl die Id und Typ in der Hash-Code verwenden möchten, können Sie sie einfach zusammen xor:

public int GetHashCode() { 
    return (int)Id^(int)Type; 
} 
1

Wenn Sie wissen, dass es nie (oder selten) ein Duplikat geben wird id dann können Sie einfach das verwenden.

Aber im Allgemeinen eine gute HashCode für zwei ints zu bekommen a und b Sie eine kleine prime p und a + p * b berechnen wählen.

+0

Ich war nur besorgt über Überläufe zu sehen, wie einige der Typen Uint Werte am Ende der Uint Bereich haben. – uriDium

+2

@uriDium: Standardmäßig wird der Überlauf ignoriert (nicht aktiviert). Hier spielt es keine Rolle, ob es einen Überlauf gibt - der Hash-Code ist auch dann noch verwendbar, wenn ein Überlauf auftritt. –

Verwandte Themen