qual é a maneira preferida de implementar hashCode ()?

Às vezes, eu preciso implementar o método hashCode () de um objeto combinando os hashCodes de seus vários membros da instância. Por exemplo, se o obj combinacional tem membros a, bec, geralmente vejo pessoas implementá-lo como


int hashCode(){
   return 31 * 31 * a.hashCode() + 31 * b.hashCode() + c.hashCode();
}

De onde vem esse número mágico 31? É o comprimento de 4 bytes ou apenas um número primo?

Existe alguma outra maneira preferida / padrão de implementar o hashCode ()?

questionAnswers(5)

yourAnswerToTheQuestion