Различные значения GetHashCode для переменных сеанса inproc и stateserver - PullRequest
0 голосов
/ 17 сентября 2008

Я недавно унаследовал приложение, которое очень интенсивно использует сеанс, включая хранение большого количества пользовательских объектов данных в сеансе. Одной из моих первых задач в этом приложении было, по крайней мере, переместить данные сеанса из InProc и загрузить их на сервер состояний или на SQL Server.

После того, как я сделал все соответствующие объекты данных сериализуемыми и изменил web.config для использования службы состояний, все казалось работающим нормально.

Однако я обнаружил, что это приложение выполняет много сравнений объектов, используя GetHashCode (). Методы, которые работали нормально, когда сеанс был InProc, больше не работают, потому что HashCodes больше не совпадают, когда они должны. Похоже, это имеет место при попытке найти определенный дочерний объект от родителя, когда вы знаете оригинальный хеш-код дочернего объекта

Если я просто верну web.config обратно на использование inproc, он снова заработает.

У кого-нибудь есть мысли о том, с чего начать?


РЕДАКТИРОВАТЬ:

qbeuek: спасибо за быстрый ответ. В отношении:

Реализация по умолчанию GetHashCode в классе Object возвращает хеш-значение на основе адреса объекта в памяти или чего-то подобного. Если требуется какое-то другое сравнение идентификаторов, необходимо переопределить как Equals, так и GetHashCode.

Я должен был дать больше информации о том, как они это используют. По сути, они имеют один родительский объект данных и несколько массивов дочерних объектов. Они случайно знают хеш-код для конкретного объекта, который им нужен, поэтому они перебирают определенный массив дочерних объектов в поисках подходящего хеш-кода. Как только совпадение найдено, они используют этот объект для другой работы.

Ответы [ 3 ]

2 голосов
/ 17 сентября 2008

Когда вы пишете

выполняет много сравнений объектов, используя GetHashCode ()

Я чувствую, что с этим кодом что-то ужасно не так. Метод GetHashCode не гарантирует, что возвращаемые значения хеш-функции должны быть в любом случае уникальными для двух разных объектов. Что касается GetHashCode, он может возвращать 0 для всех объектов и при этом считаться правильным.

Когда два объекта совпадают (метод Equals возвращает true), они ДОЛЖНЫ иметь одинаковое значение, возвращаемое из GetHashCode. Когда два объекта имеют одинаковое значение хеш-функции, они могут быть одним и тем же объектом (Equals возвращает true) или быть разными объектами (Equals возвращает false).

Других гарантий на результат GetHashCode нет.

Реализация по умолчанию GetHashCode в классе Object возвращает хеш-значение на основе адреса объекта в памяти или чего-то подобного. Если требуется какое-то другое сравнение идентификаторов, вам придется переопределить как Equals, так и GetHashCode.

1 голос
/ 18 сентября 2008

Решение 1. Создайте уникальный идентификатор для всех дочерних объектов и используйте его вместо хеш-кода.

Решение 2. Замените if (a.GetHashCode () == b.GetHashCode ()) на if (a.Equals (b)).

1 голос
/ 17 сентября 2008

Переопределите метод GetHashCode в классах, которые вызвали этот метод, и вычислите хеш-код на основе уникальных свойств объекта (например, идентификатора или всех полей объекта).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...