在大多数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