Wie viele von Ihnen verwende ich ReSharper, um den Entwicklungsprozess zu beschleunigen. Wenn Sie es verwenden, um die Gleichstellung der Mitglieder einer Klasse außer Kraft zu setzen, wird der Code-gen für GetHashCode produziert() wie folgt aussieht:Warum wird '397' für ReSharper GetHashCode override verwendet?
public override int GetHashCode()
{
unchecked
{
int result = (Key != null ? Key.GetHashCode() : 0);
result = (result * 397)^(EditableProperty != null ? EditableProperty.GetHashCode() : 0);
result = (result * 397)^ObjectId;
return result;
}
}
Natürlich habe ich dort einige meiner eigenen Mitgliedern, aber was ich will zu wissen, warum 397?
und 397 glücklich ist. Wollen wir nicht alle nur glücklich sein? –
Okay, aber warum muss es prim sein, und warum muss es genau so groß sein? Wenn es Prime sein muss, warum nicht 2 oder 2147483647? Ich denke, um eine schöne Mutation zu bekommen (und der einzige Grund für diese Multiplikation ist die Mutation), brauchen wir keine Zahl, um prim zu sein. Wir brauchen einen Multiplikator, um relativ dieselbe Anzahl oder Nullen und Einsen zu haben, vorzugsweise ohne explizite Muster. 397 = 110001101b entspricht. Noch nicht sicher über die Größenordnung. –
Wie Nick sagte, es gibt nichts besonders Besonderes. Es muss nicht diese Größe sein, das ist nur eine Zahl, die groß genug ist, dass, wenn Sie einen Hash berechnen, das Ergebnis überläuft (da GetHashCode() einen Int32 zurückgibt). eine erstklassige Auswahl für die Verteilung nur hilfreich ist, ich habe keinen mathematischen Grad so werde ich nicht versuchen, und zu erklären, aber die Multiplikation mit einer erstklassigen ein Ergebnis haben, die durch eine andere beliebige Zahl als Multiplikation verteilt mehr gut ist. –