Pregunta

Como muchos de ustedes, uso ReSharper para acelerar el proceso de desarrollo.Cuando lo usas para anular los miembros de igualdad de una clase, el código generado 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 como: ¿hay algo "especial" en el número primo 397 además de ser un número primo?
¿Fue útil?

Solución

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

Otros consejos

Ben tiene razón, reflejando la Asamblea se puede ver que es solo un número primo que han elegido usar.

El hash que utiliza Resharper parece una variante del FNV picadillo.FNV se implementa frecuentemente con diferentes números primos.Hay una discusión sobre la elección apropiada de números primos para FNV aquí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top