シリアル化アプローチは、実際にシリアル化可能なオブジェクトに対してのみ機能します。したがって、すべてのタイプのオブジェクトに対して実際に可能というわけではありません。
また、これは have equal object graphsによってオブジェクトを比較しますが、これはare equal by.equals()
と必ずしも同じではありません。
たとえば、同じコード (同じデータを持つ) によって作成された StringBuilder オブジェクトは、等しい OOS 出力 (つまり、等しいハッシュ) をもち、 whileは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
ます。