Diferentes valores de GetHashCode para inproc e variáveis ??de sessão StateServer

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

  •  01-07-2019
  •  | 
  •  

Pergunta

Eu herdei recentemente um aplicativo que faz uso pesado de sessão, incluindo o armazenamento de uma grande quantidade de objetos de dados personalizados em sessão. Um dos meus primeiros pontos de negócios com esta aplicação foi a pelo menos mover os dados da sessão longe de InProc, e off load-lo para um StateServer ou SQL Server.

Depois que eu fiz todos os dados apropriados objetos serializable, e mudou o web.config para usar um serviço de estado, tudo parecia funcionar bem.

No entanto, descobri que esta aplicação faz um monte de comparações objeto usando GetHashCode (). Métodos que funcionaram bem quando a sessão foi InProc não funcionam mais porque os hashcodes não corresponder quando é suposto. Este parece ser o caso quando se tenta encontrar um objeto filho específico de um pai quando você sabe código hash original do objeto criança

Se eu simplesmente mudar a parte traseira web.config para usar inproc, ele funciona de novo.

Alguém tem alguma opinião sobre onde começar com isso?


EDIT:

qbeuek: obrigado pela resposta rápida. No que diz respeito a:

A implementação padrão de GetHashCode na classe Object retornar um valor de hash com base no endereço objetos na memória ou algo semelhante. Se alguma outra comparação de identidade é necessária, você tem que substituir ambos Equals e GetHashCode.

Eu deveria ter dado mais informações sobre como eles estão usando isso. Basicamente, eles têm um objeto de dados pai, e há várias matrizes de objetos filho. Eles acontecem de saber o código de hash para um determinado objeto que eles precisam, então eles estão looping através de um conjunto específico de objetos filho à procura de um código de hash que partidas. Uma vez que uma correspondência for encontrada, eles, em seguida, usar esse objeto para outro trabalho.

Foi útil?

Solução

Quando você escreve

faz um monte de comparações objeto usando GetHashCode ()

Eu sinto que há algo terrivelmente errado com este código. O método GetHashCode não garante, que os valores de hash devolvidos devem estar em qualquer forma única dada dois objetos diferentes. Tanto quanto GetHashCode está em causa, ele pode retornar 0 para todos os objetos e ainda ser considerada correta.

Quando dois objetos são os mesmos (o iguala o método retorna true), eles deve tem o mesmo valor retornado de GetHashCode. Quando dois objetos têm o mesmo valor hash, eles pode ser o mesmo objeto (Equals Retorna true) ou ser objetos diferentes (Equals Retorna false).

Não existem outras garantias sobre o resultado de GetHashCode.

A implementação padrão de GetHashCode na classe Object retornar um valor de hash com base no endereço objetos na memória ou algo semelhante. Se alguma outra comparação de identidade é necessária, você Have a substituir ambos Equals e GetHashCode.

Outras dicas

Substitua o método GetHashCode em classes que são chamados este método e calcular o código hash com base em propriedades de objetos únicos (como o ID ou todos os campos de objeto).

Solução 1:. Criar uma identificação única para todos os objetos filho e o uso que em vez de código hash

Solução 2:. Substituir se (a.GetHashCode () == b.GetHashCode ()) com se (a.Equals (b))

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top