给定一个数字列表,例如一些唯一的整数或长 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()
计算数组内存地址的哈希值,而不是数组中原始元素的累积哈希码。
除了单独散列每个元素之外,在这种情况下还可以使用哪些其他方法?