我想要一种方法来获取二维数组的唯一ID。 例如:
数组A:
[4,2,3]
[4,5,6]
[7,8,9]
数组B:
[9,2,3]
[4,5,6]
[1,1,9]
我希望函数知道A<> B而不保存整个A和整个B.
提前致谢
答案 0 :(得分:7)
好吧,要获得有保证的唯一值,将有效地保存数组的完整内容。您可以使用哈希来告诉您一个阵列可能是否与另一个阵列相同,但如果没有无损转换,则无法获得唯一性。
作为简单散列函数的一个例子:
int hash = 17;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
hash = hash * 31 + array[i, j];
}
}
return hash;
现在,两个不同的数组很可能具有不同的哈希 - 但它们可能不会。
您愿意在ID上花多少空间,数组中的每个值有多大?您愿意在ID中提供的信息越多,您获得误报的可能性就越小......直到您进入ID与阵列一样大的阶段,此时您可以确保您'当然会有没有误报。
答案 1 :(得分:0)
public static long computeHash(int[][] array) {
final int p = 16777619;
long hash = 2166136261l;
for(int i = 0; i< array.length; i++) {
for(int j = 0; j < array[i].length; j++) {
hash = (hash ^ array[i][j] ^ (i * j)) * p;
}
}
hash += hash << 13;
hash ^= hash >> 7;
hash += hash << 3;
hash ^= hash >> 17;
hash += hash << 5;
return hash;
}
关于哈希函数:here