Я читаю эффективный C #, и есть комментарий по поводу Object.GetHashCode()
, который я не понял:
Object.GetHashCode()
использует внутреннее поле в классеSystem.Object
для генерации хеш-значения. Каждому созданному объекту при создании назначается уникальный ключ объекта, который сохраняется в виде целого числа.
Эти ключи начинаются с 1 и увеличиваются каждый раз, когда создается новый объект любого типа. Поле идентификатора объекта устанавливается в конструктореSystem.Object
и не может быть изменено позже.Object.GetHashCode()
возвращает это значение как хэш-код для данного объекта.
Я попытался посмотреть документацию на Object.GetHashCode()
и не нашел никакой информации по этому поводу.
Я написал простой фрагмент кода для печати хэш-кода вновь созданных объектов:
using System;
namespace TestGetHashCode
{
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
{
object o = new object();
Console.WriteLine(o.GetHashCode());
}
}
}
}
Первыми напечатанными числами были:
37121646,
45592480,
57352375,
2637164,
41014879,
3888474,
25209742,
26966483,
31884011
Что, казалось, не подходило для этого
Эти ключи начинаются с 1 и увеличиваются каждый раз, когда создается новый объект любого типа ..._ 9_ возвращает это значение
Затем, чтобы найти это «внутреннее поле в System.Object
», я попытался использовать декомпилированные исходные коды ReSharper, но найденный мной код был
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
[__DynamicallyInvokable]
public virtual int GetHashCode()
{
return RuntimeHelpers.GetHashCode(this);
}
и снова, используя декомпилированные источники, я обнаружил, что RuntimeHelpers.GetHashCode
был реализован как
[SecuritySafeCritical]
[__DynamicallyInvokable]
[MethodImpl(MethodImplOptions.InternalCall)]
public static int GetHashCode(object o);
после атрибута MethodImpl кажется, что я не могу просмотреть реализацию, и это для меня тупик.
Может кто-нибудь объяснить комментарий автора (первая цитата)?
Что такое внутреннее поле в классе Object и как оно используется для реализации Object.GetHashCode()
?
GetHashCode()
должен возвращать уникальный идентификатор? Это называетсяGet*Hash*Code()
, а неGet*UniqueIdentifier*()
специально - person zerkms   schedule 29.11.2014return 42;
, и все будет работать (не так эффективно, как могло бы быть, но ничего не сломается). - person zerkms   schedule 29.11.2014object
. Хотя реализация его какreturn 42
будет генерировать равенство для всех возвращаемых объектов. Не уверен, что вы думаете об этом - person Yuval Itzchakov   schedule 29.11.2014Int32
, что означает, чтоInt64
, например, не может иметь уникальный хэш-код для каждого возможного значения (обязательно должно быть как минимум дваlong
с одинаковым хешем).String
- еще один очевидный пример, вы можете создавать практически бесконечное количество разных строк, которые, очевидно, не могут иметь уникальных хешей ... и этот список можно продолжать и продолжать ... - person InBetween   schedule 29.11.2014