在大多數hashcode()類型實現中,碰撞被接受爲不可避免的並且經過測試。
如果您絕對必須沒有碰撞,保證,您概述的解決方案將工作。
除此之外,還有加密散列函數,如MD5和SHA,其中衝突極不可能(儘管可以強制執行很多努力)。 Java密碼體系結構具有這些實現。這些方法可能比爲您的解決方案實現非常大的集合更好。它們也會在固定時間內執行,併爲相同的字符串提供相同的代碼,而不管字符串以何種順序添加。並且,它不需要存儲每個字符串。加密哈希結果可以被認爲是整數,但它們不適合java int - 你可以使用BigInteger來保存它們,正如另一個答案中的建議。順便說一句,如果你因爲碰撞'非常不可能'的想法而被推遲,那麼在你的計算機內存或硬盤上隨機翻轉並導致任何程序的行爲與你不同的可能性相似期望:-)
注意,在一些散列函數(例如MD5)中也存在一些理論上的弱點,但爲了您的目的可能無所謂,您可以使用最有效的這種函數 - 這些弱點僅與相關如果有人惡意試圖想出與另一個字符串具有相同代碼的字符串。
編輯:我只是注意到你的問題的標題,似乎你想要雙向映射,儘管你沒有在問題中說明這一點。它是(設計上)不可能從加密哈希到原始字符串。如果你真的需要這個,你必須將一個映射密鑰散列存儲回字符串。
我不知道爲什麼你想Integer通過toString()輕鬆地將字符串映射到字符串,反之亦然使用Integer.valueOf()所以有什麼意義? – cletus 2008-12-20 18:31:21
@cletus:使用Integer.valueOf(),「Hello」不容易映射爲整數。 – 2008-12-20 18:32:29
那麼測試問題的有效性部分呢?這個問題確實需要重申和/或澄清。它沒有任何意義。 – cletus 2008-12-20 18:35:40