Нет ограничений на количество объектов, которые программа может создать, вызвать GetHashCode()
и отказаться от них. Однако существует ограничение в 4 294 967 296 различных значений GetHashCode()
. Если программа вызывает GetHashCode
4 294 967 297 раз, по крайней мере один из этих вызовов должен вернуть значение, которое уже было возвращено ранее.
Теоретически было бы возможно, чтобы система сохранила пул значений хеш-кода, а для объектов, для которых отказались, их хэш-коды были возвращены в пул, чтобы GetHashCode()
могла гарантировать, что она никогда не вернет то же значение, что и у любого другого живого объекта (при условии, что существует не более 4 294 967 296 живых объектов, как минимум). С другой стороны, хранение такой информации будет дорогостоящим и не принесет большой пользы. С практической точки зрения столь же хорошо, чтобы система генерировала произвольное число, либо когда объект создается, либо когда в первый раз вызывается GetHashCode()
. Будут случайные коллизии, но, как правило, их недостаточно, чтобы беспокоить хорошо написанный код.
Кстати, я иногда думал, что для каждого объекта было бы полезно иметь 64-битный идентификатор, который гарантированно уникален, и который также будет ранжировать объекты в порядке их создания. 64-битный идентификатор никогда не будет переполнен в течение жизни любой предсказуемой программы, и возможность присвоить объектам ранжирование может быть полезной в некоторых сценариях кэширования или интернирования. Например, если программа генерирует некоторые большие объекты путем чтения данных из файлов и часто сканирует их, чтобы найти различия, она может часто находить объекты, которые содержат идентичные данные, но различаются. Если два разных объекта оказываются идентичными и взаимозаменяемыми, замена ссылки на более новый объект более старым может значительно ускорить будущие сравнения между ними; если многие совпадающие объекты сравниваются между собой, многие ссылки на более новые объекты заменяются ссылками на самые старые, без необходимости что-либо явно кэшировать. Однако при отсутствии каких-либо средств определения «возраста» такие подходы на самом деле не сработали бы, поскольку не было бы способа узнать, от какой ссылки следует отказаться в пользу другой.