Я работаю над проблемой, где я хочу хранить объекты, состоящие из двух целочисленных массивов одинаковой длины (например, int a[] ={1,2,3,4}
и int b[] ={1,2,2,6}
) в структуре данных (например, hashmap). Однако для разных объектов длина двух массивов может различаться. Оба массива состоят из целых чисел из заданного интервала (например, между 0-200).
Для хранения объектов с двумя массивами я хочу назначить один хеш-ключ, который быстро вычисляется, сохраняет обе последовательности и приведет к минимальным коллизиям.
Сначала я попытался использовать Arrays.deepHashCode(int[][])
но быстро нашли столкновения. Во-вторых, я попытался распределить значения в массивах более равномерно, изменив a [i] и b [i] на новые значения, чтобы a_new[i] = Math.pow(31,a[i]) % Math.pow(2,16)
(фактически используя BigInteger, чтобы избежать переполнения: BigInteger.valueOf(31).modPow(BigInteger.valueOf(a[i]), BigInteger.valueOf(Math.pow(2,16)))
; используя BigInteger. Так как интервал значений ограничен, я могу предварительно рассчитать его для каждого возможного значения. В результате я пришел к следующему решению:
int result = 31;
for (int i = 0; i < a.length; i++) {
result = result * 31 * a_new[i];
result = result * 31 * b_new[i];
}
Это решение, кажется, работает, когда есть только меньшие массивы, но один раз [] и b [] могут содержать до 10 значений, что также приводит к коллизиям. Теперь мне интересно, есть ли лучший способ добиться того, что я хочу, с меньшим коллизиями.
Редактировать: я исправил это использование правильный java код для полномочий