Se você usar o próprio menu de refatoração do Visual Studio para adicionar uma implementação GetHashCode a uma classe como esta:
e selecione a única propriedade int na classe:
ele gera esse código no .NET Framework:
public override int GetHashCode()
{
return -1937169414 + Value.GetHashCode();
}
(gera HashCode.Combine(Value)
no .NET Core, o que não tenho certeza se envolve o mesmo valor)
O que há de especial nesse valor? Por que o Visual Studio não usa Value.GetHashCode()
diretamente? Pelo que entendi, isso realmente não afeta a distribuição de hash. Como é apenas uma adição, valores consecutivos ainda se acumulam juntos.
Edição: Eu só tentei isso com diferentes classes com Value
propriedades, mas aparentemente o nome da propriedade afeta o número gerado. Por exemplo, se você renomear a propriedade como Halue
, o número se tornará 387336856. Agradecimentos a Gökhan Kurt, que apontou isso.
int
.
-1937169414
é a multiplicação inteira de -1521134295
e -783812246
. O número mais significativo aqui é o -1521134295
que aparece em todo cálculo de código de hash. -783812246
é o número da semente. Um número de semente é escolhido com base no número de membros na equação. Em classes anônimas, o número da semente é calculado com base nos nomes dos campos. Portanto, existem tantos números de sementes quanto números inteiros. Podemos assumir que um número inicial é aleatório. Quanto ao significado de -1521134295
, acho que reduz a colisão e apenas um desenvolvedor interno seria capaz de responder com precisão como.