hash resharper hash-code-uniqueness

¿Por qué se usa ''397'' para la anulación de ReSharper GetHashCode?



hash-code-uniqueness (3)

Al igual que muchos de ustedes, uso ReSharper para acelerar el proceso de desarrollo. Cuando lo usa para anular los miembros de igualdad de una clase, el código-gen que produce para GetHashCode () se ve así:

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; } }

Por supuesto, tengo algunos de mis propios miembros allí, pero lo que quiero saber es por qué 397?

  • EDITAR: Entonces mi pregunta estaría mejor redactada ya que, ¿hay algo "especial" sobre el número primo 397 fuera de ser un número primo?

Ben está en lo correcto, reflejando la Asamblea puede ver que es solo un número primo que han elegido usar.


El hash que usa el reafilador parece una variante del hash FNV . FNV se implementa con frecuencia con diferentes números primos. Hay una discusión sobre la elección apropiada de primos para FNV here .


Probablemente porque 397 es un primo de tamaño suficiente como para causar que la variable de resultado se desborde y mezclar los bits del hash, proporcionando una mejor distribución de los códigos hash. No hay nada especial en 397 que lo distinga de otros primos de la misma magnitud.