Я ищу хэш-функцию для целочисленного массива, содержащего около 17 целых чисел. В HashMap содержится около 1000 элементов, и я хочу, чтобы вычисления были как можно быстрее.
Меня сейчас путают многие хеш-функции, и я замечаю, что большинство из них предназначены для строк с разными символами. Итак, есть ли хеш-функция, предназначенная для строк только с номерами и быстро запускаемая?
Спасибо за ваше терпение!
Вы не указали никаких требований (кроме скорости вычисления), но посмотрите на java.util.Arrays # hashCode. Он также должен быть быстрым, просто повторяя один раз над массивом и объединяя элементы в вычислении int
.
Возвращает хэш-код на основе содержимого указанного массива. Для любых двух непустых int-массивов a и b, таких как Arrays.equals(a, b), также имеет место Arrays.hashCode(a) == Arrays.hashCode(b).
Значение, возвращаемое этим методом, является тем же значением, которое было бы получено путем вызова метода hashCode в списке, содержащем последовательность экземпляров Integer, представляющих элементы a в том же порядке. Если a равно null, этот метод возвращает 0.
И hashmap принимает массив целого в качестве ключа.
Вообще-то, нет!
Вы можете технически использовать int[]
в качестве ключа в HashMap
в Java (вы можете использовать любой тип Object
), но это не сработает, поскольку массивы не определяют полезный метод hashCode
(или полезный метод equals
), Таким образом, ключ будет использовать идентификатор объекта. Два массива с идентичным содержимым будут считаться отличными друг от друга.
Вы можете использовать List<Integer>
, который реализует hashCode
и equals
. Но имейте в виду, что вы не должны мутировать список после установки его в качестве ключа. Это сломает хэш-таблицу.
Функции hashmap можно найти в https://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html
Создание хэш-карты очень просто.
HashMap<Object, Integer> map = new HashMap<Object, Integer>();