.NET реализация намеренно не публикуется (и когда вы попытаетесь декомпилировать ее, вы обнаружите, что она выполняет неуправляемый вызов фреймворка).Единственная документация как таковая - здесь , в которой только говорится, что «не гарантируется создание разных значений для каждого объекта», и «может меняться между версиями платформы».Делать какие-либо предположения о том, как это на самом деле работает, вероятно, неуместно.
Java более понятен (хотя предположительно может отличаться в разных JVM) и конкретно рассматривается в этом вопросе: Will .hashcode () возвращать другое значение int из-за сжатия пространства владения?
Суть реализации Java заключается в том, что по контракту значение хеш-кода объекта не имеет значения, пока оно не будет получено в первый раз.После этого оно должно оставаться постоянным.Таким образом, GC, перемещающий объект, не имеет значения до тех пор, пока метод hashcode () объекта не будет вызван в первый раз.После этого используется кэшированное значение.