假设我有两个数组,例如[B,D,C,A]
和[B,A,D,C]
。什么机制会在两个数组(以及任何包含其元素排列的数组)上生成相同的校验和?
在以下示例中,check_a
和check_b
将不相等。将元素按字母顺序排列不是一种选择,因为数组中的对象可能根本不是字符串或任何可排序的对象。
String[] a = {"B","D","C","A"};
String[] b = {"B","A","D","C"};
String check_a = a.hashCode();
String check_b = b.hashCode();
快速示例
public class ArrayHash {
public static void main(String[] args) {
String[] one = new String[]{"A", "B", "C", "D"};
String[] two = new String[]{"D", "C", "B", "A"};
System.out.println("One = " + one.hashCode());
System.out.println("Two = " + two.hashCode());
System.out.println("Method for one = "+hash(one));
System.out.println("Method for two = "+hash(two));
}
private static int hash(Object[] array) {
int ret = 0;
for (Object c : array) {
ret += (124567890 + c.hashCode()) * c.hashCode();
}
return ret;
}
}
它给出一个输出
One = 366712642
Two = 1829164700
Method for one = 266
Method for two = 266
正如您所看到的,您必须对所有元素进行迭代,并对它们的散列求和(或相乘)。无论它们的顺序如何,都会得到相同的结果。
假设您有一个函数可以获取元素的checksumm。若要获得您想要的校验和,您需要找到具有交换属性的操作,其中有很多。例如+
、*
、^