如何获得二维阵列的唯一ID?

时间:2010-11-18 17:30:22

标签: c# algorithm multidimensional-array

我想要一种方法来获取二维数组的唯一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.

提前致谢

2 个答案:

答案 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