0

可能重复:
为什么 java 中的 String.hashCode() 没有以较少冲突的方式实现?

对于非加密哈希,Java 的String.hashCode()表现如何?

主要是我担心碰撞。

谢谢。

4

2 回答 2

4

您似乎误解了.hashCode()Java 的用途,更具体地说.equals().hashCode()java.lang.Object.

对任何人来说,唯一的合同部分是,如果两个对象关于 相等.equals(),那么它们必须具有与返回相同的哈希码.hashCode()该合同没有其他义务

因此,编写这样的自定义.hashCode()实现是完全合法的,尽管这是可以想象的次优:

@Override
public int hashCode()
{
    // Legal, but useless
    return 42;
}

当然,JDK 开发人员永远不会那么厚,.hashCode()内置类型(包括String)的实现已经足够好,您甚至不需要担心冲突。即便如此,这种实现很可能会因一个 JDK 实现而异,它的“加密价值”也会如此。

但这不是重点。

要考虑的最重要的事情是这与密码学完全.hashCode()无关。它的唯一义务是遵守由 定义的合同。java.lang.Object

于 2013-01-05T01:52:20.467 回答
0

它作为通用哈希函数非常好。即你通常不应该担心它。

尤其:

  • 它很快,在某种程度上它可能会产生散列,因为 CPU 可以从内存中读取字符串(即,如果不跳过大部分字符串,您通常无法变得更好)。它只对字符串中的每个字符进行一次乘法和一次加法。
  • 对于典型的随机字符串集,它会在整个int范围内产生分布良好的散列。

显然,它不是加密哈希函数,所以不要使用它。此外,请注意您可能遇到哈希冲突,因为它正在生成 32 位哈希。所以你只需要设计你的算法来考虑到这一点。

于 2013-01-05T01:47:34.700 回答