Реализация вашего hashCode () не имеет большого значения, если вы не сделаете его супер глупым. Вы могли бы просто вернуть сумму всех хеш-кодов строк (усеченных до целых), но вы должны убедиться, что вы исправили это:
Если реализация хеш-кода идет медленно, рассмотрите возможность кэширования его в экземпляре. В зависимости от того, как долго остаются ваши ключевые объекты и как они используются с хэш-таблицей, когда вы получаете из нее что-то, вы можете не захотеть тратить больше времени, чем необходимо, вычисляя одно и то же значение снова и снова. Если вы придерживаетесь реализации Jon hashCode (), то, вероятно, в этом нет необходимости, поскольку String уже кеширует свой hashCode () для вас.
Это, однако, скорее общий совет, так как с середины 90-х я видел, как довольно много разработчиков зацикливались на медленных (и еще хуже, меняющихся) реализациях hashCode ().
Не будьте неряшливыми, когда создаете реализацию equals (). Ваше значение equals () выше будет неэффективным и ошибочным. Прежде всего вам не нужно сравнивать значения, если объекты имеют разные хеш-коды. Вы также должны вернуть false (а не исключение нулевого указателя), если вы получите нулевое значение в качестве аргумента.
Правила просты, эта страница проведет вас через них.
Edit:
Я должен спросить еще одну вещь ... Вы говорите: «Проблема в том, что дублирующие ключи могут быть созданы, если в значении поля появляется разделитель». Это почему?
Если формат «ключ + разделитель + ключ + разделитель + ключ», то на самом деле не имеет значения, есть ли в ключах один или несколько разделителей, если вам не очень не повезло с комбинацией двух клавиш, и в этом случае вам, вероятно, следовало бы выбрать другую разделитель (в Юникоде есть из чего выбирать).
Во всяком случае, Джон прав в своем комментарии ниже ... Не используйте кеширование, "пока вы не доказали, что это хорошо". Это хорошая практика всегда.