문제

저는 최근에 세션에 많은 사용자 정의 데이터 개체를 저장하는 것을 포함하여 세션을 매우 많이 사용하는 응용 프로그램을 상속받았습니다.이 응용 프로그램에 대한 첫 번째 비즈니스 포인트 중 하나는 최소한 세션 데이터를 InProc에서 이동하고 이를 상태 서버나 SQL Server로 오프로드하는 것이었습니다.

모든 적절한 데이터 개체를 직렬화하고 상태 서비스를 사용하도록 web.config를 변경한 후에 모든 것이 제대로 작동하는 것처럼 보였습니다.

그러나 나는 이 응용 프로그램이 GetHashCode()를 사용하여 많은 개체 비교를 수행한다는 것을 발견했습니다.세션이 InProc일 때 제대로 작동했던 메서드는 더 이상 HashCode가 예상대로 일치하지 않기 때문에 작동하지 않습니다.자식 개체의 원래 해시 코드를 알고 있을 때 부모로부터 특정 자식 개체를 찾으려고 할 때 발생하는 것으로 보입니다.

web.config를 inproc을 사용하도록 다시 변경하면 다시 작동합니다.

어디서부터 시작해야할지 생각하는 사람이 있습니까?


편집하다:

크브엑:빠른 답변 감사합니다.에 관해서:

Object 클래스의 GetHashCode 기본 구현은 메모리의 개체 주소 또는 유사한 항목을 기반으로 해시 값을 반환합니다.다른 ID 비교가 필요한 경우 Equals 및 GetHashCode를 모두 재정의해야 합니다.

그들이 이것을 어떻게 사용하고 있는지에 대해 더 많은 정보를 제공했어야 했습니다.기본적으로 하나의 상위 데이터 개체가 있고 여러 개의 하위 개체 배열이 있습니다.그들은 필요한 특정 개체에 대한 해시 코드를 알고 있으므로 일치하는 해시 코드를 찾기 위해 특정 하위 개체 배열을 반복합니다.일치하는 항목이 발견되면 해당 개체를 다른 작업에 사용합니다.

도움이 되었습니까?

해결책

당신이 쓸 때

GetHashCode()를 사용하여 많은 객체 비교를 수행합니다.

이 코드에 뭔가 심각한 문제가 있는 것 같아요.GetHashCode 메서드는 반환된 해시 값이 서로 다른 두 개체에 대해 어떤 방식으로든 고유해야 한다고 보장하지 않습니다.GetHashCode에 관한 한 모든 개체에 대해 0을 반환할 수 있으며 여전히 올바른 것으로 간주됩니다.

두 개체가 동일한 경우(Equals 메서드가 true를 반환함) 해야 하다 GetHashCode에서 반환된 동일한 값을 갖습니다.두 객체가 동일한 해시 값을 가질 때, ~할 수 있다 동일한 객체일 수도 있고(Equals가 true를 반환함) 다른 객체일 수도 있습니다(Equals가 false를 반환함).

GetHashCode의 결과에 대한 다른 보장은 없습니다.

Object 클래스의 GetHashCode 기본 구현은 메모리의 개체 주소 또는 유사한 항목을 기반으로 해시 값을 반환합니다.다른 신원 비교가 필요한 경우 ~해야 한다 Equals와 GetHashCode를 모두 재정의합니다.

다른 팁

이 메서드를 호출하는 클래스에서 GetHashCode 메서드를 재정의하고 고유한 개체 속성(예: ID 또는 모든 개체 필드)을 기반으로 해시 코드를 계산합니다.

해결 방법 1:모든 하위 개체에 대한 고유 ID를 생성하고 이를 해시 코드 대신 사용합니다.

해결 방법 2:if (a.GetHashCode() == b.GetHashCode())를 if (a.Equals(b))로 바꾸세요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top