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