2008-09-19 8 views
124

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?

  • EDIT: Also meine Frage wäre besser formuliert als, gibt es etwas "Besonderes" über die 397 Primzahl außerhalb davon eine Primzahl zu sein?
  • Antwort

    134

    weil 397 eine Primzahl von ausreichender Größe die Ergebnisvariable um zu bewirken, Überlauf und die Bits des Hash etwas zu mischen, um eine bessere Verteilung der Hash-Codes bereitstellt. Es gibt nichts besonderes an 397, das es von anderen Primzahlen derselben Größenordnung unterscheidet.

    +59

    und 397 glücklich ist. Wollen wir nicht alle nur glücklich sein? –

    +2

    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. –

    +4

    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. –

    15

    Ben ist korrekt, spiegelt die Assembly Sie können sehen, es ist nur eine Primzahl, die sie gewählt haben zu verwenden. Wahrscheinlich

    +8

    was die Montage? –

    +9

    asm: 'JetBrains.ReSharper.Feature.Services.CSharp' Methode:' CSharpEqualityHelper.GenerateGetHashCodeBody' –

    6

    Der Hash, dass ReSharper verwendet sieht aus wie eine Variante des FNV Hash. FNV wird häufig mit unterschiedlichen Primzahlen implementiert. Es gibt eine Diskussion über die geeignete Wahl der Primzahlen für FNV here.