2014-11-26 2 views
1

Я ищу хэш-функцию для целочисленного массива, содержащего около 17 целых чисел. В HashMap содержится около 1000 элементов, и я хочу, чтобы вычисления были как можно быстрее.нахождение хеш-функции для длинного целочисленного массива

Меня сейчас путают многие функции хэша, и я замечаю, что большинство из них предназначены для строк с разными символами. Итак, есть ли хеш-функция, предназначенная для строк только с номерами и быстро запускаемая?

Благодарим за ваше терпение!

+0

вы имеете в виду HashMap внутри HashMap? или hashmap, который принимает строку как ключ и целое число как значение? – Joseph118

+0

Извините за неоднозначное описание. На самом деле я просто хочу запросить объект по ключу в hashmap. И hashmap принимает массив целого в качестве ключа. – RickyGao

+0

Связанные: http://stackoverflow.com/questions/1058149/using-a-byte-array-as-hashmap-key-java http://stackoverflow.com/questions/2627889/java-hashmap-with-int- array? rq = 1 – Thilo

ответ

1

Вы не указали какие-либо требования (кроме скорости расчета), но взгляните на java.util.Arrays#hashCode. Он также должен быть быстрым, просто повторяя один раз над массивом и объединяя элементы в вычислении int.

Возвращает хэш-код, основанный на содержимом указанного массива. Для любых двух непустых int-массивов a и b, таких как Arrays.equals (a, b), также имеет место Arrays.hashCode (a) == Arrays.hashCode (b).

Значение, возвращаемое этим методом, является тем же значением, которое было бы получено путем вызова метода hashCode в списке, содержащем последовательность экземпляров Integer, представляющих элементы a в том же порядке. Если равно нулю, то этот метод возвращает 0.


И HashMap принимает массив целого числа в качестве ключа.

Собственно, нет!

Вы могли бы технически использовать int[] в качестве ключа в HashMap в Java (вы можете использовать любой вид Object), но это не будет хорошо работать, так как массивы не определяют полезный hashCode метод (или полезный equals метод). Таким образом, ключ будет использовать идентификатор объекта. Два массива с идентичным содержимым будут считаться отличными друг от друга.

Вы можете использовать List<Integer>, который реализует hashCode и equals. Но имейте в виду, что вы не должны мутировать список после установки его в качестве ключа. Это сломает хэш-таблицу.

+0

Спасибо ~ Я посмотрел на них, и я просто хочу узнать больше о вычислении хэш-кода. В принципе, я хочу как можно меньше столкновений с хэш-кодами. Поскольку есть менее 1000 предметов, я думаю, что он должен генерировать почти никакой конфликт. И я также хочу, чтобы вычисление было быстрым, поскольку оно будет реализовано в течение длительного времени.Еще раз спасибо за ваши усилия ~ – RickyGao

+0

Вычисление хеш-кода определяется по адресу http://docs.oracle.com/javase/6/docs/api/java/util/List.html#hashCode%28%29. Довольно просто, просто добавление и умножение с 31. – Thilo

+0

Мне было интересно, достаточно ли этого использовать в этом случае? Есть ли лучшие решения? Я видел некоторые хеш-функции, такие как хэш FNV и хэш ELF. Похоже, что они также хороши для реализации. – RickyGao

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