Хеш-код как serialVersionUid - PullRequest
       84

Хеш-код как serialVersionUid

0 голосов
/ 21 ноября 2018

Я прочитал в статье, что по умолчанию serialVersionUid, предоставляемый JVM, является хеш-кодом объекта.Если мы не переопределим метод хеш-кода в классе, как будет вычисляться хеш-код во время десериализации, поскольку обычно хеш-код является адресом памяти объекта?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Я думаю, что вы не поняли.Это не hashcode.serialVersionUid - статическая переменная, hashcode - метод экземпляра, и значение хеш-кода объекта изменяет объект в объект.

serialVersionUid рассчитывается на основе структуры вашего класса - полей, методов и т. Д.указанный в http://download.oracle.com/javase/6/docs/platform/serialization/spec/serialTOC.html http://download.oracle.com/javase/6/docs/platform/serialization/spec/class.html#4100 для точного формата.

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

Последовательность элементов в потоке выглядит следующим образом:

  • Имя класса.

  • Модификаторы класса записываются как 32-разрядное целое число.

  • Имя каждого интерфейса, отсортированное по имени.

  • Для каждого поля класса, отсортированного по имени поля (кроме закрытых статических и закрытыхпереходные поля:

    • Имя поля.
    • Модификаторы поля, записанные в виде 32-разрядного целого числа.
    • Дескриптор поля.
  • Если инициализатор класса существует, запишите следующеег:

    • Название метода,.
    • Модификатор метода, java.lang.reflect.Modifier.STATIC, записанный как 32-разрядное целое число.
    • Дескриптор метода, () V.
  • Для каждого не частного конструктора, отсортированного по имени метода и сигнатуре:

    • Название метода.
    • Модификаторы метода, записанные в виде 32-разрядного целого числа.
    • Дескриптор метода.
  • Для каждого не частного метода, отсортированного по имени метода и сигнатуре:

    • TheНазвание метода.
    • Модификаторы метода записываются как 32-разрядное целое число.
    • Дескриптор метода.
    • Алгоритм SHA-1 выполняется в потоке байтов, созданных DataOutputStream, и выдает пять 32-битных значений sha [0..4].Значение хеша составляется из первого и второго 32-битных значений дайджеста сообщения SHA-1.Если результат дайджеста сообщения, пять 32-битных слов H0 H1 H2 H3 H4, находится в массиве из пяти значений int с именем sha, значение хеш-функции будет вычислено следующим образом:
    • long hash = ((sha [0] >>> 24) & 0xFF) |

      ((sha [0] >>> 16) & 0xFF) << 8 | </p>

      ((sha [0] >>> 8) & 0xFF) << 16 | </p>

      ((sha [0] >>> 0) & 0xFF) << 24 | </p>

      ((sha [1] >>> 24) & 0xFF) << 32 | </p>

      ((sha [1] >>> 16) & 0xFF) << 40 | </p>

      ((sha [1]>>> 8) & 0xFF) << 48 | </p>

      ((sha [1] >>> 0) & 0xFF) << 56; </p>

Здесь long hash не относится к hashcode

0 голосов
/ 21 ноября 2018

В статье я прочитал, что по умолчанию serialVersionUid, предоставляемый JVM, является хеш-кодом объекта.

Это неверно.(Либо статья неверна, либо вы ее неправильно прочитали / неправильно поняли.)

UID последовательной версии по умолчанию для сериализуемого класса полностью не связан с hashCode.

Алгоритм генерации UID серийной версии по умолчанию описан здесь:

По сути, он создает SHA-1 хеш от имени классов, модификаторов, имен интерфейсов и сигнатур его полей, конструкторов и методов.Затем он берет первые 8 байтов хэша и собирает их в long.

...