Как упоминает VoroniPotato, вы можете переопределить GetHashCode
самостоятельно, но реализация по умолчанию GetHashCode
работает для записи следующим образом.Если предположить, что fields
является списком значений полей в записи, то выполняются следующие шаги:
- Начать с начального значения 0.
Затем для каждого элемента в поле, начиная с последнего определенного (т.е. с учетом типа записи {a: int; b: string}
мы начинаем с b
), выполните следующее:
0x9e3779b9 + fields.[i].GetHashCode() + (value <<< 6) + (value >>> 2)
, где value - это значение изпредыдущая итерация алгоритма.Мы предполагаем, что fields.[i]
не равно нулю, в противном случае его значение хэш-функции просто установлено на 0.
- Повторите шаг 2 для всех полей.
Это можно увидеть висходный код из mkRecdHashWithComparer и mkAddToHashAcc .
Для простой записи примера {a: int; b: string}
декомпилированный метод GetHashCode
выглядит так:
[CompilerGenerated]
public sealed override int GetHashCode(IEqualityComparer comp)
{
if (this != null)
{
int num = 0;
num = -1640531527 + ((b@?.GetHashCode() ?? 0) + ((num << 6) + (num >> 2)));
return -1640531527 + (a@ + ((num << 6) + (num >> 2)));
}
return 0;
}