对于非加密哈希,Java 的String.hashCode()
表现如何?
主要是我担心碰撞。
谢谢。
对于非加密哈希,Java 的String.hashCode()
表现如何?
主要是我担心碰撞。
谢谢。
您似乎误解了.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
它作为通用哈希函数非常好。即你通常不应该担心它。
尤其:
int
范围内产生分布良好的散列。显然,它不是加密哈希函数,所以不要使用它。此外,请注意您可能会遇到哈希冲突,因为它正在生成 32 位哈希。所以你只需要设计你的算法来考虑到这一点。