【问题标题】:Best way to derive / compute a unique hash from a given String in Java从 Java 中的给定字符串派生/计算唯一哈希的最佳方法
【发布时间】:2017-01-22 15:29:56
【问题描述】:

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

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

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

【问题讨论】:

  • 您将总是在某些值之间发生冲突。 Strings 比 Strings 的 32 个字符多。
  • 没错!理论上是不可能的。谢谢!

标签: java hash md5 sha1 md5sum


【解决方案1】:

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

一个长度为 N 的 Java 字符串有 65536 ^ N 个可能的状态,并且需要 一个 16 * N 位的整数来表示所有可能的值。如果你 编写一个散列函数,生成具有较小范围的整数(例如 小于 16 * N 位),您最终会发现超过 一个字符串散列到相同的整数;即哈希码不能 独特。这被称为鸽巢原理,并且有一个 直接的数学证明。 (你不能打数学赢!)

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

更新:查看另一个好答案:What is a good 64bit hash function in Java for textual strings?

【讨论】:

    猜你喜欢
    • 2015-10-27
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 2018-05-16
    相关资源
    最近更新 更多