在Java中从给定的字符串派生/计算唯一哈希的最佳方法是什么?

3

我正在寻找一种在Java中为给定字符串计算唯一哈希的方法。看起来我不能使用MD5或SHA1,因为人们声称它们已经被破解并且不能保证唯一性。

对于两个通过equals()方法相等的String对象,我应该获得相同的哈希(最好是像MD5摘要一样的32个字符的字符串)。而其他任何字符串都不应该生成此哈希 - 这是棘手的部分。

在Java中有没有一种实现这个的方法?


4
某些值之间始终会发生碰撞。有比32个字符的字符串更多的字符串。 - resueman
没错!理论上不可能。谢谢! - rkrishnan
1个回答

6
如果需要保证唯一性的哈希码,则不可能(理论上可能但实际上不可能)。哈希和哈希码是非唯一的。
Java字符串长度为N,有65536 ^ N个可能状态,并且需要一个具有16 * N位的整数来表示所有可能的值。如果编写生成范围较小的整数的哈希函数(例如小于16 * N位),则最终会发现多个字符串哈希到相同的整数;即哈希码不能是唯一的。这被称为鸽巢原理,有一个直接的数学证明。(你不能反抗数学并获胜!)
但是,如果可以接受“可能唯一”,并且存在极小的非唯一性概率,则加密哈希值是一个好的选择。数学将告诉您哈希必须有多大(即有多少位),才能实现给定(足够低)的非唯一性概率。
更新:查看另一个好的答案:在Java中用于文本字符串的好的64位哈希函数是什么?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接