MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Какой код выполняется в GetHashCode для созданного мной класса?"
Answer 1021594
Стандартная реализация GetHashCode для object возвращает значение, генерируемое отдельно для каждого объекта, и никак не зависит от значений его полей (т.е., его использование при сравнении эквивалентно сравнению по ссылке). Так как он реализован в CLR, исходников GetHashCode из .NET Framework нет в официальных источниках. Реализацию GetHashCode из .NET Core можно посмотреть в исходниках CoreCLR (C++). Для этого нужно сначала найти соответствующий неуправляемый метод в файле coreclr/src/vm/ecalllist.h. Для RuntimeHelpers.GetHashCode это ObjectNative::GetHashCode:
FCFuncElement("GetHashCode", ObjectNative::GetHashCode)
Если дойти до получения самого значения, то это будет метод Thread.GetNewHashCode:
inline DWORD GetNewHashCode() { LIMITED_METHOD_CONTRACT; // Every thread has its own generator for hash codes so that we won't get into a situation // where two threads consistently give out the same hash codes. // Choice of multiplier guarantees period of 2**32 - see Knuth Vol 2 p16 (3.2.1.2 Theorem A). DWORD multiplier = GetThreadId()*4 + 5; m_dwHashCodeSeed = m_dwHashCodeSeed*multiplier + 1; return m_dwHashCodeSeed; }
То же самое в исходниках .NET Framework CLR, из неофициальных источников.
Таким образом, если нужен пример вычисления хэш-кода для своего типа, исходный код object.GetHashCode бесполезен. В качестве примера реализации вычисления хэш-кода на основе полей объекта вместо него можно взять например код генератора метода GetHashCode для анонимных типов из исходников компилятора C#.
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.