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

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

Также подумал, что кто-то должен также упомянуть, что вам следует делать, чтобы избежать нарезка ... Получите копию стандартов кодирования C ++, 101 правила и рекомендации.

Он предлагает несколько сложный шаблон, чтобы полностью решить проблему: иметь защищенный экземпляр копии, защищенный чистый виртуальный DoClone и публичный клон с утверждением, которое скажет вам если (далее) производный класс не смог правильно выполнить DoClone. (Метод Clone делает правильную глубокую копию полиморфного объекта.)

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

0
задан Miguel Ruivo 24 March 2019 в 12:57
поделиться

1 ответ

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

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

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

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

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

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

0
ответ дан T.J. Crowder 24 March 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: