Luffy1
@Luffy1
Студент, Junior .NET programmer

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

Привет, Хабрачане! Я облазил весь инет в надежде найти что-нибудь про генерирование хэш-кода в классе object, но, в итоге, наткнулся только на статьи с Java, а не с C#, и то, даже в статьях с Jav'ой были свои заморочки. Поэтому, пожалуйста, расскажите мне, недалеко смотрящему, как всё таки работает генерация хэш-кодов в object в C#(версии 8.0)? Там генерация случайного числа, или адрес объекта преобразуется в целочисленный вид, или что? Объясните, пожалуйста. =' )
  • Вопрос задан
  • 516 просмотров
Решения вопроса 2
firedragon
@firedragon
Senior .NET developer
/// <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.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
от 3 000 до 4 000 $
BRIO MRS Казань
от 70 000 до 120 000 ₽
Frostgate studio Новосибирск
от 60 000 до 100 000 ₽
22 сент. 2020, в 03:43
35000 руб./за проект
22 сент. 2020, в 02:11
10000 руб./за проект
22 сент. 2020, в 00:19
75000 руб./за проект