В большинстве реализаций типа hashcode () коллизии принимаются как неизбежные и проверяются на.
Если вам абсолютно не нужно никаких столкновений, гарантировано, решение, которое вы наметите, будет работать.
Помимо этого, существуют криптографические хеш-функции, такие как MD5 и SHA, где коллизии крайне маловероятны (хотя с большими усилиями можно их форсировать). У Криптографической Архитектуры Java есть реализации их. Эти методы могут быть быстрее, чем хорошая реализация вашего решения для очень больших наборов. Они также будут выполняться в постоянное время и давать один и тот же код для одной и той же строки, независимо от того, в каком порядке добавляются строки. Кроме того, не требуется хранить каждую строку. Результаты хеширования в криптографии могут рассматриваться как целые числа, но они не вписываются в Java-int - вы можете использовать BigInteger, чтобы сохранить их, как предложено в другом ответе.
Кстати, если вас отталкивает мысль о том, что коллизия является «крайне маловероятной», вероятно, аналогичная вероятность того, что бит случайно перевернется в памяти вашего компьютера или на жестком диске, приведет к тому, что любая программа будет вести себя не так, как вы ожидаете :-)
Обратите внимание, что в некоторых хэш-функциях (например, MD5) также есть некоторые теоретические недостатки, но для ваших целей это, вероятно, не имеет значения, и вы можете просто использовать наиболее эффективную такую функцию - эти недостатки актуальны только в том случае, если кто-то злонамеренно пытается придумать строки, которые имеют тот же код, что и другая строка.
edit: Я только что заметил в заголовке вашего вопроса, кажется, вы хотите двунаправленное отображение, хотя вы на самом деле не утверждаете это в вопросе. По замыслу невозможно перейти от крипто-хеша к исходной строке. Если вам это действительно нужно, вам придется хранить хеши ключей на карте в строках.