Java中的String.hashCode

时间:2013-01-05 01:33:14

标签: java

  

可能重复:
  why do String.hashCode() in java is not implemented in a way with less conflicts?

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

主要是我担心碰撞。

感谢。

2 个答案:

答案 0 :(得分: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定义的合同。

答案 1 :(得分:0)

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

特别是:

  • 它很快,因为它可能会产生哈希值,因为CPU可以从内存中读取字符串(例如,如果不跳过字符串的大部分内容,通常情况下会变得更好)。它只在String中为每个字符添加一个乘法和一个。
  • 对于典型的随机字符串集,它会在整个int范围内生成分布均匀的哈希值。

显然,它不是加密哈希函数,所以不要使用它。此外,请注意,您可能获取哈希冲突,因为它会产生32位哈希。因此,您只需设计算法即可将其考虑在内。