C# хэш-алгоритм для структуры

программирование C# базы данных .net

Есть структура:
struct Foo
{
public int x;
public int y;
public bool flag;
}

необходимо различать их по хэшу, однако дефолтный метод возвращает одинаковые хэши для двух структур с разынм значением полей:

var a = (new Foo()
{
x = 0,
y = 0,
flag = true,
}).GetHashCode();

var b = (new Foo()
{
x = 0,
y = 1,
flag = true,
}).GetHashCode();

var state = a == b;

в результате state = истина. Помогите написать свой собтвенный GetHashCode.

Примечание:
>а GUID нельзя использовать?
Как именно? можно пример?

Примечание:
>медленно и говнокодисто
и не работает. если объединить x и y, то у одного объекта x=11, y=2, а у другого x=1 y=12. результат конкатенации 112 в обоих случаях.

Примечание:
doronin.m, не понимаю - что это даст? Необходимо получать _хэш_-функции. Они зависят от содержимого, а не просто генеряться псевдо-случайным образом. У двух разных структур с одинаковыми значениями всех полей должны быть одинаковые хэши. а для трех структур с треямя различными вариантами значений полей должно быть три различных хэша.
Ответы:
а GUID нельзя использовать?
doronin.m
Вот спасибо отличная идея на счет гуида )
недавно тоже над похожим вопросом бился, думал откуда взять уникальные ID для объектов...
Не знаю как у тебя получается в твоём примере одинаковый хэшкод.Он должен быть разным,даже если ты укажешь в структурах одинаковые значения.Дефолтный хэшкод берётся из адреса в оперативной памяти базового класса для структуры.То есть у Object.По-этому если не переопределить GetHashCode(),то для двух объектов всегда будет разный хешкод,независимо от их значений.У тебя какой то глюк.Но это если ты создаёшь структуру с помощью new.То есть ты помещаешь структуру в кучу, а ссылку на неё в стек.
Другое дело,когда ты создаёшь структуру как положено.Без new.Тогда она вся помещается на стек,так как структура по своей сути не ссылочный тип,а тип значений.Вот здесь начинаются интересности,связанные с особенностями функционирования стека.Для оптимизации памяти,когда в стек помещается объект,проверяется,есть ли уже такой.Если есть,то просто увеличивается счётчик.Новый объект не создаётся.Если такого нет,то создаётся.Следовательно,когда ты в стеке берёшь две одинаковые структуры и сравниваешь их хэшкод,он будет одинаковым,так как у их Object один и тот же адрес.Если у структуры изменить какое то поле,то она уже помещается на новое место,а в том счётчик уменьшается.По-этому у двух струтур с одинаковыми значениями будет одинаковый хэш код,а у разных разный.Даже не нужно переопределять GetHashCode().
Вообще использовать структуру с new не имеет особого смысла.Они оставлены в C# только для оптимизации,причём в отличии от С++ они не являются аналогами классов.Они как тип значений распологаются на стеке,а следовательно доступ к ним осуществляется напрямую,не через ссылку и значит быстрее.Плюс не создаётся в куче сложная инфраструктура для хранения.
Foo f;
f.x=1;
f.y=2;
f.flag=true;
Если создавать структуру через new,то теряются все преимущества структуры.


13 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.