Ich habe viel über dieses interessante Thema (IMO) gelesen. aber ich bin nicht ganz verstehen eins:Wörterbuch <,> Größe, GetHashCode und Primzahlen?
Wörterbuch Größe erhöht seine Kapazität (verdoppelt sich auf die nächste Primzahl) zu einer Primzahl (wenn Neuzuteilung): weil:
int index = hashCode % [Dictionary Capacity];
- So können wir sehen, dass Primzahlen hier für
[Dictionary Capacity]
verwendet werden, weil ihre GreatestCommonFactor1
ist. und dieses hilft, um Kollisionen zu vermeiden.
Zusätzlich
ich viele Proben der Umsetzung der GetHashCode()
gesehen habe:
Hier ist ein Beispiel von Jon Skeet:
public override int GetHashCode()
{
unchecked
{
int hash = 17;
// Suitable nullity checks etc, of course :)
hash = hash * 23 + field1.GetHashCode();
hash = hash * 23 + field2.GetHashCode();
hash = hash * 23 + field3.GetHashCode();
return hash;
}
}
Ich verstehe nicht:
Frage Dictionary capacity
und bei der Erzeugung von getHashCode
: auf
Hat sind Primzahlen sowohl in verwendet?
Da oben in dem Code, gibt es eine gute Chance, dass der Rückgabewert wird nicht eine Primzahl [bitte korrigiert mich wenn ich falsch bin] wegen der
- Multiplikation mit
23
- Addition der
GetHashCode()
Wert für jedes Feld.
zum Beispiel: (11,17,173 sind Primzahlen)
int hash = 17;
hash = hash * 23 + 11; //402
hash = hash * 23 + 17; //9263
hash = hash * 23 + 173 //213222
return hash;
213222 keine Primzahl ist.
Auch gibt es keine mathematische Regel, den Staat:
(not a prime number) + (prime number) = (prime number)
noch
(not a prime number) * (prime number) = (prime number)
noch
(not a prime number) * (not a prime number) = (prime number)
So was fehlt mir??
wo haben Sie diese GetHashCode-Implementierung gesehen? – Tigran
@Tigran http://Stackoverflow.com/a/263416/859154 –
Ich lese nie irgendwo, dass Hash-Codes prim sein sollten, oder sogar, dass es besser ist, wenn sie prim sind - was sie sein sollten, ist so gleichmäßig wie möglich verteilt ihre gesamte Bandbreite. – MiMo