GetHashCode for objects
От: #John Европа https://github.com/ichensky
Дата: 30.11.18 13:46
Оценка: -1 :))) :))) :)))
Здравствуйте,
Зачем нужна такая реализация 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}");
        }

Вывод:
g: 58225482
a: 54267293
b: 54267293
g2: 18643596
g3: 18643596
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re: GetHashCode for objects
От: karbofos42 Россия  
Дата: 30.11.18 13:59
Оценка: +1
Здравствуйте, #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>

J>Вывод:
J>
J>g: 58225482
J>a: 54267293
J>b: 54267293
J>g2: 18643596
J>g3: 18643596
J>


Хэш в принципе не должен гарантировать другое поведение. Главное — чтобы для одного объекта возвращался один и тот же хэш.
Re: GetHashCode for objects
От: romangr Россия  
Дата: 30.11.18 14:02
Оценка: 19 (2) +6 :))
Здравствуйте, #John, Вы писали:


var b = new object();
var hash_b = a.GetHashCode(); // может все-таки b.GetHashCode() ?

var g3 = new Gg();
var hash_g3 = g2.GetHashCode(); // может все-таки g3.GetHashCode() ?
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[2]: GetHashCode for objects
От: Kolesiki  
Дата: 30.11.18 15:23
Оценка:
Здравствуйте, karbofos42, Вы писали:

K>Хэш в принципе не должен гарантировать другое поведение. Главное — чтобы для одного объекта возвращался один и тот же хэш.


А про коллизии вы что-нибудь слышали?
Re[3]: GetHashCode for objects
От: karbofos42 Россия  
Дата: 30.11.18 17:24
Оценка:
Здравствуйте, Kolesiki, Вы писали:

K>Здравствуйте, karbofos42, Вы писали:


K>>Хэш в принципе не должен гарантировать другое поведение. Главное — чтобы для одного объекта возвращался один и тот же хэш.


K>А про коллизии вы что-нибудь слышали?


ну, я и написал по сути, что хэш допускает коллизии (для разных объектов может вернуться одно значение). это ТС почему-то рассчитывал на их отсутствие.
Re[4]: GetHashCode for objects
От: samius Япония http://sams-tricks.blogspot.com
Дата: 30.11.18 17:49
Оценка:
Здравствуйте, karbofos42, Вы писали:

K>ну, я и написал по сути, что хэш допускает коллизии (для разных объектов может вернуться одно значение). это ТС почему-то рассчитывал на их отсутствие.


Более того, допускается что хэш будет для любых значений один.
Re: GetHashCode for objects
От: Hacker_Delphi Россия  
Дата: 12.12.18 05:43
Оценка:
Здравствуйте, #John, Вы писали:

J>Здравствуйте,

J>Зачем нужна такая реализация GetHashCode в .net, что для разных объектов эта функция может возращать одно и тоже число.
J>
[skipped]
J>            var g3 = new Gg();
J>            var hash_g3 = g2.GetHashCode();
[skipped]
J>        }
J>


на самом деле — ошибка в указанной строке... внимательнее надо быть
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[2]: GetHashCode for objects
От: Mr.Delphist  
Дата: 12.12.18 15:36
Оценка:
Здравствуйте, Hacker_Delphi, Вы писали:

H_D>на самом деле — ошибка в указанной строке... внимательнее надо быть


Внимательнее надо быть (ц) — такая ошибка там не одна
Re[3]: GetHashCode for objects
От: Sinclair Россия https://github.com/evilguest/
Дата: 12.12.18 17:54
Оценка: +1 :))) :))) :)
У вас тут чё, шабаш?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: GetHashCode for objects
От: Mr.Delphist  
Дата: 13.12.18 06:22
Оценка: +1 -1
Здравствуйте, Sinclair, Вы писали:

S>
S>У вас тут чё, шабаш?

А чему удивляться — я уже не один раз говорил, что с уходом Хейлсберга в MS настоящим Delphi стал C#/NET, а не эта стюардесса, которую всё никак не закопают.
Re: GetHashCode for objects
От: Вертер  
Дата: 06.01.19 19:58
Оценка:
Здравствуйте, #John, Вы писали:

J>Здравствуйте,

J>Зачем нужна такая реализация GetHashCode в .net, что для разных объектов эта функция может возращать одно и тоже число.

не совсем по теме, но дефолтная реализация GetHashCode не совсем хорошая. Если пользуетесь этой функцией, то прочитайте этиу статью:

Performance implications of default struct equality in C#

Conclusion:
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.