Как пояснил в комментариях GökhanKurt , число изменяется в зависимости от названий свойств. Если вы переименуете свойство в Halue
, вместо этого число станет 387336856. Я пробовал это с разными классами, но не думал о переименовании свойства.
Комментарий Гекхана заставил меня понять его назначение. Это смещение значений ha sh, основанное на детерминированности c, но случайно распределенном смещении. Таким образом, объединение значений ha sh для разных классов, даже с простым добавлением, все еще немного устойчиво к коллизиям ha sh.
Например, если у вас есть два класса с похожими реализациями GetHashCode:
public class A
{
public int Value { get; set;}
public int GetHashCode() => Value;
}
public class B
{
public int Value { get; set;}
public override int GetHashCode() => Value;
}
и если у вас есть другой класс, который содержит ссылки на эти два:
public class C
{
public A ValueA { get; set; }
public B ValueB { get; set; }
public override int GetHashCode()
{
return ValueA.GetHashCode() + ValueB.GetHashCode();
}
}
плохая комбинация, подобная этой, будет склонна к коллизиям ha sh, потому что в результате ха * Код 1024 * будет накапливаться вокруг одной и той же области для разных значений ValueA и ValueB, если их значения близки друг к другу. На самом деле не имеет значения, используете ли вы умножение или побитовые операции для их объединения, они все равно будут подвержены коллизиям без равномерно удаленного смещения. Поскольку многие целочисленные значения, используемые в программировании, накапливаются около 0, имеет смысл использовать такое смещение
По-видимому, хорошей практикой является случайное смещение с хорошими битовыми комбинациями.
I ' Я до сих пор не уверен, почему они не используют совершенно случайные смещения, возможно, чтобы не нарушать код, основанный на детерминизме GetHashCode (), но было бы здорово получить комментарий от команды Visual Studio по этому поводу.