Luffy1
@Luffy1
Student, Junior .NET programmer, C#, JS, HTML/CSS

Как генерируется hashcode по умолчанию, то есть в классе object, в C#?

Привет, Хабрачане! Я облазил весь инет в надежде найти что-нибудь про генерирование хэш-кода в классе object, но, в итоге, наткнулся только на статьи с Java, а не с C#, и то, даже в статьях с Jav'ой были свои заморочки. Поэтому, пожалуйста, расскажите мне, недалеко смотрящему, как всё таки работает генерация хэш-кодов в object в C#(версии 8.0)? Там генерация случайного числа, или адрес объекта преобразуется в целочисленный вид, или что? Объясните, пожалуйста. =' )
  • Вопрос задан
  • 565 просмотров
Решения вопроса 2
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
/// <summary>Служит хэш-функцией по умолчанию.</summary>
    /// <returns>Хэш-код для текущего объекта.</returns>
    [__DynamicallyInvokable]
    public virtual int GetHashCode()
    {
      return RuntimeHelpers.GetHashCode(this);
    }

https://stackoverflow.com/questions/720177/default...

Она же вызывает вот этот нативный код.

FCIMPL1(INT32, ObjectNative::GetHashCode, Object* obj) {  
    CONTRACTL  
    {  
        THROWS;  
        DISABLED(GC_NOTRIGGER);  
        INJECT_FAULT(FCThrow(kOutOfMemoryException););  
        MODE_COOPERATIVE;  
        SO_TOLERANT;  
    }  
    CONTRACTL_END;  

    VALIDATEOBJECTREF(obj);  

    DWORD idx = 0;  

    if (obj == 0)  
        return 0;  

    OBJECTREF objRef(obj);  

    HELPER_METHOD_FRAME_BEGIN_RET_1(objRef);        // Set up a frame  

    idx = GetHashCodeEx(OBJECTREFToObject(objRef));  

    HELPER_METHOD_FRAME_END();  

    return idx;  
}  
FCIMPLEND


Еще посмотрите эту статью.
see Knuth Vol 2 p16 (3.2.1.2 Theorem A)

https://habr.com/ru/post/188038/

https://codingsight.com/the-origin-of-gethashcode-...
Ответ написан
Комментировать
Griboks
@Griboks Куратор тега C#
Хотелось бы добавить, что стандартная реализация не стандартизирована и не рекомендуется к явному использованию.
Furthermore, .NET does not guarantee the default implementation of the GetHashCode method, and the value this method returns may differ between .NET implementations, such as different versions of .NET Framework and .NET Core, and platforms, such as 32-bit and 64-bit platforms. For these reasons, do not use the default implementation of this method as a unique object identifier for hashing purposes.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы