1
resposta

Lógica de implementação do hashCode gerado pela IDE

Olá! Gostaria de entender a montagem do método hashCode

@Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((nome == null) ? 0 : nome.hashCode());
        result = prime * result + numeroMatricula;
        return result;
    }
  1. Porquê ele usa esse 31 como número primo para montar o código de espalhamento? Li que é algo sobre ser um valor numérico que otimiza o espalhamento dos buckets de Hash. É isso, alguem saberia dizer mais especificamente esse funcionamento?

  2. Qual o resultado prático de realizar a multiplicação prime * result? (na primeira atribuição de result)

  3. nome.hashCode() é a implementação da classe String?

1 resposta

A ideia de usar um número primo no hashcode é porque você quer que o número que você está multiplicando e o número de dados nos quais você está inserindo tenham fatorações primárias ortogonais.

Suponha que haja 8 dados para inserir. Se o número que você está usando para multiplicar por for múltiplo de 8, o bloco inserido somente será determinado pela entrada menos significativa (a que não foi multiplicada). Entradas semelhantes irão colidir. Não é bom para uma função hash.

31 é um primo grande o suficiente para que o número de dados seja improvável de ser divisível por ele (e, de fato, as implementações modernas do Java HashMap mantêm o número em uma potência de 2).

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software