Diferentes valores de GetHashCode para las variables de sesión inproc y stateserver

StackOverflow https://stackoverflow.com/questions/86660

  •  01-07-2019
  •  | 
  •  

Pregunta

Recientemente heredé una aplicación que hace un uso muy intensivo de la sesión, incluido el almacenamiento de una gran cantidad de objetos de datos personalizados en la sesión.Uno de mis primeros puntos de negocio con esta aplicación fue al menos mover los datos de la sesión fuera de InProc y descargarlos a un servidor de estado o a SQL Server.

Después de serializar todos los objetos de datos apropiados y cambiar web.config para usar un servicio estatal, todo pareció funcionar bien.

Sin embargo, descubrí que esta aplicación realiza muchas comparaciones de objetos usando GetHashCode().Los métodos que funcionaban bien cuando la sesión era InProc ya no funcionan porque los HashCodes ya no coinciden cuando se supone que deben hacerlo.Este parece ser el caso cuando se intenta encontrar un objeto secundario específico de un padre cuando se conoce el código hash original del objeto secundario.

Si simplemente vuelvo a cambiar web.config para usar inproc, funciona nuevamente.

¿Alguien tiene alguna idea sobre por dónde empezar con esto?


EDITAR:

qbeuek:Gracias por la rápida respuesta.En lo que respecta a:

La implementación predeterminada de GetHashCode en la clase Object devuelve un valor hash basado en la dirección del objeto en la memoria o algo similar.Si se requiere alguna otra comparación de identidad, debe anular tanto Equals como GetHashCode.

Debería haber dado más información sobre cómo están usando esto.Básicamente, tienen un objeto de datos principal y hay varias matrices de objetos secundarios.Resulta que conocen el código hash de un objeto particular que necesitan, por lo que recorren una matriz específica de objetos secundarios en busca de un código hash que coincida.Una vez que encuentran una coincidencia, usan ese objeto para otro trabajo.

¿Fue útil?

Solución

Cuando escribes

hace muchas comparaciones de objetos usando GetHashCode()

Siento que hay algo terriblemente mal con este código.El método GetHashCode no garantiza que los valores hash devueltos sean de alguna manera únicos dados dos objetos diferentes.En lo que respecta a GetHashCode, puede devolver 0 para todos los objetos y aún así considerarse correcto.

Cuando dos objetos son iguales (el método Equals devuelve verdadero), DEBE tener el mismo valor devuelto por GetHashCode.Cuando dos objetos tienen el mismo valor hash, poder ser el mismo objeto (Equals devuelve verdadero) o ser objetos diferentes (Equals devuelve falso).

No existen otras garantías sobre el resultado de GetHashCode.

La implementación predeterminada de GetHashCode en la clase Object devuelve un valor hash basado en la dirección del objeto en la memoria o algo similar.Si se requiere alguna otra comparación de identidad, usted tengo que anule tanto Equals como GetHashCode.

Otros consejos

Anule el método GetHashCode en las clases que se llaman este método y calcule el código hash en función de propiedades únicas del objeto (como ID o todos los campos del objeto).

Solución 1:Cree una ID única para todos los objetos secundarios y utilícela en lugar del código hash.

Solución 2:Reemplace if (a.GetHashCode() == b.GetHashCode()) con if (a.Equals(b)).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top