代码之家  ›  专栏  ›  技术社区  ›  Homam

如何获取二维数组的唯一ID?

  •  0
  • Homam  · 技术社区  · 15 年前

    我想要一种方法来获得二维数组的唯一ID。 例如:

    数组A:

    [4,2,3]
    [4,5,6]
    [7,8,9]
    

    数组B:

    [9,2,3]
    [4,5,6]
    [1,1,9]
    

    我想让一个函数知道a<gt;b不保存整个a和整个b。

    提前谢谢

    2 回复  |  直到 15 年前
        1
  •  7
  •   Jon Skeet    15 年前

    好吧,为了得到保证 独特的 你的价值 有效地保存数组的完整内容。您可以使用一个散列,它将告诉您一个数组是否是 可能地 和另一个一样,但如果不进行无损转换,就无法获得唯一性。

    作为简单散列函数的示例:

    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和数组一样大的阶段,这时您可以确保 当然是误报。

        2
  •  0
  •   Damian Leszczyński - Vash    15 年前
     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