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

rkr*_*nan 2 java hash md5 sha1 md5sum

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

对于通过该equals()方法相等的两个 String 对象,我应该获得相同的哈希值(最好是 32 个字符的字符串,如 MD5 Sum)。并且没有其他 String 应该生成这个哈希 - 这是棘手的部分。

有没有办法在 Java 中实现这一点?

Ris*_*shi 5

如果需要保证唯一的哈希码,那么这是不可能的(理论上可行但实际上不可行)。散列和散列码是非唯一的。

长度为 N 的 Java 字符串有 65536 ^ N 个可能的状态,并且需要一个 16 * N 位的整数来表示所有可能的值。如果你写一个散列函数产生一个较小范围的整数(例如小于 16 * N 位),你最终会发现不止一个 String 散列到同一个整数的情况;即哈希码不能是唯一的。这被称为鸽巢原理,并且有一个直接的数学证明。(你不能与数学作斗争并获胜!)

但是,如果“可能是唯一的”且非唯一性的可能性很小是可以接受的,那么加密哈希就是一个很好的答案。数学将告诉您散列必须有多大(即多少位)才能实现给定(足够低)的非唯一性概率。

更新:检查另一个好的答案:Java 中用于文本字符串的好的 64 位哈希函数是什么?