Здравствуйте,
Зачем нужна такая реализация GetHashCode в .net, что для разных объектов эта функция может возращать одно и тоже число.
static void Main(string[] args)
{
var g =new Gg();
var hash_g = g.GetHashCode();
var a = new object();
var hash_a = a.GetHashCode();
var b = new object();
var hash_b = a.GetHashCode();
var g2 =new Gg();
var hash_g2 = g2.GetHashCode();
var g3 = new Gg();
var hash_g3 = g2.GetHashCode();
Console.WriteLine($"g: {hash_g}");
Console.WriteLine($"a: {hash_a}");
Console.WriteLine($"b: {hash_b}");
Console.WriteLine($"g2: {hash_g2}");
Console.WriteLine($"g3: {hash_g3}");
}
Здравствуйте, #John, Вы писали:
J>Здравствуйте, J>Зачем нужна такая реализация GetHashCode в .net, что для разных объектов эта функция может возращать одно и тоже число. J>
J> static void Main(string[] args)
J> {
J> var g =new Gg();
J> var hash_g = g.GetHashCode();
J> var a = new object();
J> var hash_a = a.GetHashCode();
J> var b = new object();
J> var hash_b = a.GetHashCode();
J> var g2 =new Gg();
J> var hash_g2 = g2.GetHashCode();
J> var g3 = new Gg();
J> var hash_g3 = g2.GetHashCode();
J> Console.WriteLine($"g: {hash_g}");
J> Console.WriteLine($"a: {hash_a}");
J> Console.WriteLine($"b: {hash_b}");
J> Console.WriteLine($"g2: {hash_g2}");
J> Console.WriteLine($"g3: {hash_g3}");
J> }
J>
varb = new object();
var hash_b = a.GetHashCode(); // может все-таки b.GetHashCode() ?varg3 = new Gg();
var hash_g3 = g2.GetHashCode(); // может все-таки g3.GetHashCode() ?
Здравствуйте, karbofos42, Вы писали:
K>Хэш в принципе не должен гарантировать другое поведение. Главное — чтобы для одного объекта возвращался один и тот же хэш.
Здравствуйте, Kolesiki, Вы писали:
K>Здравствуйте, karbofos42, Вы писали:
K>>Хэш в принципе не должен гарантировать другое поведение. Главное — чтобы для одного объекта возвращался один и тот же хэш.
K>А про коллизии вы что-нибудь слышали?
ну, я и написал по сути, что хэш допускает коллизии (для разных объектов может вернуться одно значение). это ТС почему-то рассчитывал на их отсутствие.
Здравствуйте, karbofos42, Вы писали:
K>ну, я и написал по сути, что хэш допускает коллизии (для разных объектов может вернуться одно значение). это ТС почему-то рассчитывал на их отсутствие.
Более того, допускается что хэш будет для любых значений один.
Здравствуйте, #John, Вы писали:
J>Здравствуйте, J>Зачем нужна такая реализация GetHashCode в .net, что для разных объектов эта функция может возращать одно и тоже число. J>
[skipped]
J> var g3 = new Gg();
J> var hash_g3 = g2.GetHashCode();
[skipped]
J> }
J>
на самом деле — ошибка в указанной строке... внимательнее надо быть
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
S> Hacker_Delphi S> Mr.Delphist S>S>У вас тут чё, шабаш?
А чему удивляться — я уже не один раз говорил, что с уходом Хейлсберга в MS настоящим Delphi стал C#/NET, а не эта стюардесса, которую всё никак не закопают.
Здравствуйте, #John, Вы писали:
J>Здравствуйте, J>Зачем нужна такая реализация GetHashCode в .net, что для разных объектов эта функция может возращать одно и тоже число.
не совсем по теме, но дефолтная реализация GetHashCode не совсем хорошая. Если пользуетесь этой функцией, то прочитайте этиу статью:
The default equality implementation for structs may easily cause a severe performance impact for your application. The issue is real, not a theoretical one.
The default equliaty members for value types are reflection-based.
The default GetHashCode implementation may provide a very poor distribution if a first field of many instances is the same.
There is an optimized default version for Equals and GetHashCode but you should never rely on it because you may stop hitting it with an innocent code change.
You may rely on FxCop rule to make sure that every struct overrides equality members, but a better approach is to catch the issue when the "wrong" struct is stored in a hash set or in a hash table using an analyzer.