Подход сериализации работает только для объектов, которые на самом деле сериализуемы. Таким образом, для все типы объектов на самом деле невозможны.
Кроме того, это сравнивает объекты на и имеют эквивалентные графы объектов , которые не обязательно совпадают с равными .equals()
.
Например, объекты StringBuilder, созданные одним и тем же кодом (с одинаковыми данными), будут иметь одинаковый выходной сигнал OOS (т. Е. Также равный хеш), тогда как b1.equals(b2)
равен false, а ArrayList и LinkedList с одинаковыми элементами будут зарегистрированы как отличается, в то время как list1.equals(list2)
равно true
.
Вы можете избежать шага преобразования байтов в массив , создав пользовательский HashOutputStream
, который просто берет байтовые данные и хэширует их, вместо того, чтобы сохранять их как массив для последующей итерации.
class HashOutputStream extends OutputStream {
private static final int PRIME = 13;
private int hash;
// all the other write methods delegate to this one
public void write(int b) {
this.hash = this.hash * PRIME + b;
}
public int getHash() {
return hash;
}
}
Затем оберните ваш ObjectOutputStream вокруг объекта этого класса.
Вместо вашего y = y*13 + x
метода вы можете посмотреть другие алгоритмы контрольной суммы. Например, java.util.zip содержит Adler32
(используется в формате zlib
) и CRC32
(используется в формате gzip
).