根据http://java-bytes.blogspot.com/2009/10/hashcode-of-string-in-java.html:“首先,它是一个已知的事实,即没有完美的哈希算法,没有碰撞。”
作者在谈论实际而不是理论上对吗?因为从理论上讲,这里是一个完美的哈希函数:“对于给定的对象,给它分配一个新的数字”。有无数的数字,所以我们总会有东西分配给一个独特的对象。实际上,这是不可行的,因为我们的内存量有限。
答案 0 :(得分:8)
通常,散列函数从一组对象(宇宙)映射到较小的一组对象(codomain)。通常,Universe是一个无限集,例如所有字符串的集合或所有数字的集合,并且codomain是有限集合,例如所有512位字符串的集合,或者0之间的所有数字的集合在Java中,对象上的hashCode
函数具有值的codomain,可以用int
表示,它是所有32位整数。
我相信当作者说'#34;没有完美的哈希函数"是没有可能的方法将所有字符串的无限集映射到所有32位整数的集合中,而不至少有一次冲突。事实上,如果你选择2个 32 + 1个不同的字符串,你就可以保证至少有一次碰撞。
您的论点 - 我们不能为每个对象分配不同的哈希码吗? - 隐含假设哈希函数的codomain是无限的。例如,如果您尝试使用此方法为字符串构建哈希函数,则哈希函数的codomain必须是所有可能自然数的集合,因为存在无限多个字符串。大多数编程语言都不支持以这种方式工作的哈希码,尽管你在理论上这是正确的。当然,有人可能反对并说这并不算作有效的哈希函数,因为通常哈希函数具有有限的codocins。
希望这有帮助!