Почему хэш-код объекта по умолчанию возвращает разное значение на разных устройствах?

#java #android #algorithm #memory #hashcode

#java #Android #алгоритм #память #хэш-код

Вопрос:

Если посмотреть на некоторые ответы со всех сторон, то, похоже, существует множество мнений о том, что возвращает значение по умолчанию hashCode() для разных объектов: некоторые говорят, что он запускает один и тот же алгоритм, некоторые говорят, что это зависит от местоположения в памяти.

Несмотря на это, я провел несколько тестов, в которых я вызываю значение по умолчанию myCustomObject.hashCode() на разных эмуляторах Android, и кажется, что в каждом эмуляторе значение hashCode всегда одно и то же (даже после его перезагрузки), но отличается для каждого из них.

Исходя из этого, я не уверен, действительно ли он основан на алгоритме; или если этот алгоритм содержит некоторую информацию, связанную с тем, где он выполняется, или даже если он действительно основан на памяти (в чем я сомневаюсь, поскольку он будет иметь то же значение после перезагрузки).

Комментарии:

1.«Если посмотреть на некоторые ответы со всех сторон, то, похоже, существует множество мнений о том, что возвращает default hashCode()» — это действительно не должно основываться на мнениях, скорее на фактах. Предлагаю ознакомиться с общим контрактом для Object::hashcode docs.oracle.com/javase/7/docs/api/java/lang /…

Ответ №1:

Все, что вы знаете о Object s hashCode , — это то, что говорит JavaDoc. Эта часть, вероятно, наиболее актуальна:

Насколько это разумно практично, метод hashCode, определенный class Object, возвращает разные целые числа для разных объектов. (Хэш-код может быть реализован, а может и не быть реализован как некоторая функция адреса памяти объекта в некоторый момент времени.)

Таким образом, это, вероятно, будет уникальным, но не гарантировано, и вы не можете предположить, что это будет. Это может быть или не быть «некоторой функцией» ячейки памяти объекта для любого заданного определения «ячейки памяти», или это может быть некоторый возрастающий номер, присвоенный объекту при создании, и т.д., и т.п. Вы не узнаете, не углубившись в исходный код JDK / JVM, который вы используете ( hashCode это native функция, поэтому src.zip в JDK здесь не помогает), и, более того, знание не приносит никакой прагматической пользы.

Я не уверен, действительно ли он основан на алгоритме; или если этот алгоритм содержит некоторую информацию, связанную с тем, где он выполняется, или даже если он действительно основан на памяти (в чем я сомневаюсь, поскольку он будет иметь то же значение после перезагрузки).

Это может быть индекс в куче JVM, который при использовании одной и той же программы каждый раз будет находиться в одном и том же месте.

Но опять же: вы не знаете, и нет никакой практической пользы в знании.