Pergunta

Como muitos de vocês, eu uso ReSharper para acelerar o processo de desenvolvimento. Quando você usá-lo para substituir os membros de igualdade de uma classe, o código-gen que produz para GetHashCode () se parece com:

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

Claro que tenho alguns dos meus próprios membros lá, mas o que eu estou querendo saber é por que 397?

  • EDIT:? Então, minha pergunta seria melhor redacção, há algo 'especial' sobre o 397 número primo fora de ser um número primo
Foi útil?

Solução

Provavelmente porque 397 é um primo de tamanho suficiente para causar a variável resultado de estouro e misturar os bits do hash um pouco, proporcionando uma melhor distribuição de códigos de hash. Não há nada de especial sobre 397 que a distingue de outros primos da mesma magnitude.

Outras dicas

Ben está correto, refletindo a Assembléia você pode ver é apenas um número primo que optou por fazer uso.

O hash que usa ReSharper parece uma variante do FNV hash. FNV é frequentemente implementadas com diferentes números primos. Há uma discussão sobre a escolha apropriada de primos para FNV aqui .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top