Зачем вам нужно преобразовывать каждый символ в строку (и это тоже в двоичном виде) перед преобразованием его в long
?Почему бы просто не иметь значение long
, к которому вы добавляете char
?
Это домашнее задание, поэтому я не публикую код.Вы также можете найти любую хорошую книгу по алгоритмам или поискать в Интернете), чтобы узнать больше о хешировании.
Редактировать: Я понимаю, что вы не хотите просто суммировать их, потому что у всех анаграмм будет одинаковое значение хеш-функции.Но я думаю, вы уже знаете, как этого избежать.Обратите внимание, что, объединяя биты, вы в основном добавляете биты к значению после смещения их на несколько позиций.то есть «10101» + «10001» - это то же самое, что 1010100000 + 10001 - 21 << 5 + 17. </p>
Сдвигая каждый символ на величину, пропорциональную его положению в строке, значение добавляется в хешзависит как от значения, так и от положения персонажа.Кроме того, наблюдайте тот же эффект, который можно получить, просто умножая, а не масштабируя.
Еще одна вещь, на которую следует обратить внимание, это то, что long
имеет только 64 бита.Вы можете упаковать в него столько всего char
до того, как он начнет переполняться.Таким образом, большинство практических хеш-функций принимают значение по модулю некоторого числа.Конечно, это означает, что существует только ограниченное количество возможных значений хеш-функции для неограниченного количества входных строк.Столкновения неизбежны, но правильно выбранные значения для вашего сдвига / множителя и мода могут минимизировать количество столкновений.