たとえば、一意の整数または長い ID などの数値のリストが与えられた場合、再現可能な「署名」を計算する最適な方法は何でしょうか (できれば要素の順序に関係なく)。
使用例は、ID のいずれかが (オブジェクトの) リストに追加または削除されたかどうかを検出することです。
Javaarray.hashCode()
は、JVM 呼び出し間で一貫しているように見えても、要素の順序が変更されたり、同じ要素を持つ別のインスタンスが作成されたりすると、異なるハッシュを返すため、法案に適合しません。
int[] ids1 = {1, 2, 3};
System.out.println(ids1.hashCode());
// output: 980546781
int[] ids1Copy = {1, 2, 3};
System.out.println(ids1Copy.hashCode());
// output: 2061475679
int[] ids2 = {2, 1, 3};
System.out.println(ids2.hashCode());
// output: 140435067
私の理解では、配列内のプリミティブ要素の累積ハッシュ コードではなくids1.hashCode()
、配列のメモリ アドレスのハッシュを計算します。
この場合、各要素を個別にハッシュする以外に、他にどのようなアプローチを使用できますか?