Frage

Ich habe seit ein paar Tagen über diese rätselhafte ... fühlen sich frei, alle meine Annahmen abzuschießen.

Wir verwenden ein Wörterbuch mit Integer-Tasten. Ich gehe davon aus, dass der Wert des Schlüssels in diesem Fall direkt als Hash verwendet wird. Bedeutet dies, dass (wenn die Schlüssel über einen kleinen Bereich gruppiert sind), dass die Verteilung des Schlüssel-Hash (gleich den Schlüssel selbst, nicht wahr?) In einem ähnlich kleinen Bereich sein wird und daher eine schlechte Wahl für eine Hash-Tabelle?

Wäre es besser, einen IEqualityComparer zu schaffen, der etwas tat klug mit Primzahlen und Mathematik Modulo besser verteilten Hash zu berechnen?

War es hilfreich?

Lösung

Es ist nicht verwendet direkt , dass das Wörterbuch noch den Schlüssel für seinen Hash fragen - aber den Hash-Wert eines Int32 ist nur der Wert, so dass der Schub Ihre Frage ist relevant, ja.

Ich glaube, dass die Art und Weise der .NET-Wörterbuch arbeitet beruht nicht auf Hash-Werte gleichmäßig verteilt sind. Es dauert hash % bucketCount wo bucketCount immer Primzahl ist. (Das ist aus dem Gedächtnis aber -. Ich könnte falsch sein)

Sie können nach wie vor mit einem ineffizienten Satz Schlüssel natürlich am Ende, wenn sie durch den heißen Stein Zahl Abstand passieren werden. Das ist der Fall, immer wenn - eine Hash-Tabelle würde immer nur seine wirklich O (1) für alle Tasten, wenn sie eindeutigen Hash-Werte hatten und in der Tabelle gehalten, um eine Reihe von Eimer für jede mögliche Hash :) In Wirklichkeit ist es nicht, um ein Problem neigt. Wenn Sie geschehen, zu wissen, dass es wird ein Problem, dann ja, könnte eine benutzerdefinierte IEqualityComparer<T> helfen.

Andere Tipps

Angenommen, Sie eine Standardbibliothek Hash-Tabelle Implementierung verwenden, stehen die Chancen, der Schlüssel ist, nicht die Hash, auch wenn der Schlüssel eine ganze Zahl ist, für genau den Grund, dass Sie darauf hin.

So, während Sie Ihre Logik in Bezug auf Hash-Verteilungen korrekt ist, Ihre ursprüngliche Annahme, dass Integer-Schlüssel, die Hash-Werte bedeuten würde = Schlüssel ist wahrscheinlich nicht.

Wenn ich falsch liege re: .NET dann oh gut; dies ist eher eine verallgemeinerte Antwort. :)

Vor klug, etwas zu tun Ich würde die Geschwindigkeit testen, wie sie ist, und sehen, ob es für Sie geeignet ist. Wenn dies nicht der Fall, dann versucht die clevere Sache. Aber ich würde erwarten, dass es besser ist, sie in Ruhe zu lassen; es ist wichtiger, dass die Hashes nicht kollidieren, und so lange, wie das passiert, wird das Leben in Ordnung sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top