Valori diversi di GetHashCode per le variabili di sessione inproc e stateserver

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

  •  01-07-2019
  •  | 
  •  

Domanda

Recentemente ho ereditato un'applicazione che fa un uso molto intenso della sessione, inclusa la memorizzazione di molti oggetti dati personalizzati nella sessione.Uno dei miei primi punti di interesse con questa applicazione era almeno spostare i dati della sessione lontano da InProc e caricarli su un server di stato o SQL Server.

Dopo aver reso serializzabili tutti gli oggetti dati appropriati e modificato web.config per utilizzare un servizio di stato, tutto sembrava funzionare correttamente.

Tuttavia, ho scoperto che questa applicazione esegue molti confronti di oggetti utilizzando GetHashCode().I metodi che funzionavano correttamente quando la sessione era InProc non funzionano più perché gli HashCode non corrispondono più quando dovrebbero.Questo sembra essere il caso quando si tenta di trovare un oggetto figlio specifico da un genitore quando si conosce il codice hash originale dell'oggetto figlio

Se cambio semplicemente web.config utilizzando inproc, funziona di nuovo.

Qualcuno ha qualche idea su da dove cominciare?


MODIFICARE:

qbeuek:Grazie per la risposta rapida.Riguardo a:

L'implementazione predefinita di GetHashCode nella classe Object restituisce un valore hash basato sull'indirizzo degli oggetti in memoria o qualcosa di simile.Se è richiesto un altro confronto di identità, è necessario sovrascrivere sia Equals che GetHashCode.

Avrei dovuto fornire maggiori informazioni su come lo utilizzano.Fondamentalmente, hanno un oggetto dati genitore e ci sono diversi array di oggetti figli.Capita che conoscano il codice hash per un particolare oggetto di cui hanno bisogno, quindi stanno scorrendo un array specifico di oggetti figlio alla ricerca di un codice hash che corrisponda.Una volta trovata una corrispondenza, utilizzano l'oggetto per altri lavori.

È stato utile?

Soluzione

Quando scrivi

esegue molti confronti di oggetti utilizzando GetHashCode()

sento che c'è qualcosa di terribilmente sbagliato in questo codice.Il metodo GetHashCode non garantisce che i valori hash restituiti siano in qualche modo univoci dati due oggetti diversi.Per quanto riguarda GetHashCode, può restituire 0 per tutti gli oggetti ed essere comunque considerato corretto.

Quando due oggetti sono uguali (il metodo Equals restituisce true), essi DOVERE avere lo stesso valore restituito da GetHashCode.Quando due oggetti hanno lo stesso valore hash, essi Potere essere lo stesso oggetto (Uguale restituisce vero) o essere oggetti diversi (Uguale restituisce falso).

Non ci sono altre garanzie sul risultato di GetHashCode.

L'implementazione predefinita di GetHashCode nella classe Object restituisce un valore hash basato sull'indirizzo degli oggetti in memoria o qualcosa di simile.Se è necessario qualche altro confronto di identità, tu dovere sovrascrivere sia Equals che GetHashCode.

Altri suggerimenti

Sostituisci il metodo GetHashCode nelle classi che vengono chiamate questo metodo e calcola il codice hash in base alle proprietà univoche dell'oggetto (come ID o tutti i campi dell'oggetto).

Soluzione 1:Crea un ID univoco per tutti gli oggetti figlio e utilizzalo al posto del codice hash.

Soluzione 2:Sostituisci if (a.GetHashCode() == b.GetHashCode()) con if (a.Equals(b)).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top