Что происходит с хэш-кодом identity, когда имеется больше объектов, чем может содержать `int` - PullRequest
2 голосов
/ 24 июля 2010

Метод System.identityHashCode(...) называется так, потому что он идентифицирует объекты, поэтому два разных объекта не могут иметь одинаковый хэш-код identity, верно?

Возвращает int. Но что происходит в системе с огромным объемом оперативной памяти, когда число объектов превышает целочисленный диапазон 2^32?

Не будет ли проблемой для HashMap с и HashSet с при работе с классами, которые не переопределяют equals и hashCode?

EDIT:
Если int недостаточно, могу ли я получить реальный уникальный идентификатор для объекта?

Ответы [ 3 ]

7 голосов
/ 24 июля 2010

Нет, это было бы просто обычное столкновение хешей.Два неравных объекта могут возвращать один и тот же хеш - просто тогда их нужно будет сравнить на равенство.

Это не ограничивается хеш-кодами идентичности - рассмотрим String.hashCode().Очевидно, что возможных строк больше, чем int значений, поэтому должно быть хотя бы одно хеш-значение, являющееся результатом хеширования нескольких строк.HashMap / HashSet сначала использует хеш-код для быстрого сужения набора возможных совпадений только до тех записей, которые имеют одинаковый хеш-код, а затем вызывает equals() для каждой из них по очереди, пока не найдет совпадение.или определили, что ни одна из записей не была равна данному ключу.

4 голосов
/ 24 июля 2010

Неправильно. Любое количество объектов может иметь один и тот же identityHashCode.

2 голосов
/ 24 июля 2010

"Могу ли я получить реальный уникальный идентификатор для объекта?"Я бы спросил вас, что бы вы сделали с таким идентификатором?Должен ли он быть уникальным в данный момент, в течение срока службы JVM или глобально для любого количества систем?

Вы можете сгенерировать UUID для каждого объекта, для которого вы хотите создать уникальныйидентификатор для.Тем не менее, повторяющиеся идентификаторы все еще теоретически возможны, просто крайне маловероятно.

...