2010-11-18 5 views
0

Я хочу, чтобы получить уникальный идентификатор для 2d массива. , например:Как я могу получить уникальный ID для 2-го массива?

Массив A:

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

Массив B:

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

Я хочу, чтобы функция знать, что А <> B без сохранения всей А и Б. целом

Заранее спасибо

+0

вам нужно создать уникальный хэш, или просто способ сказать массивы друг от друга делать? Ваш заголовок и текст вопроса предлагают разные вопросы ... – Oded

+0

Является ли положение целых чисел важным? –

+0

@Oded: Мне нужен уникальный хеш. – Homam

ответ

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; 

Теперь две разные массивы будут очень вероятно имеют различные хеш - но они не могут.

Сколько места вы готовы потратить на идентификатор и насколько велика каждая величина в массиве? Чем больше информации вы готовы вставить в идентификатор, тем меньше вероятность того, что вы получите ложные срабатывания ... пока не дойдете до сцены, где идентификатор такой же большой, как массив, после чего вы можете убедиться, ll имеют нет ложных срабатываний, конечно.

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

Смежные вопросы