对唯一 ID 使用哈希码

2022-09-03 18:38:09

我正在一个基于java的系统中工作,我需要为视觉显示中的某些元素设置一个id。元素的一个类别是字符串,所以我决定使用 String.hashCode() 方法来获取这些元素的唯一标识符。

然而,我遇到的问题是,如果id为负数并且经常返回负值,那么我在borks中工作的系统。一个快速的解决方案是在哈希码调用周围使用Math.abs()来保证积极的结果。我对这种方法的疑问是,两个不同的元素具有相同的哈希码的可能性有多大?String.hashCode

例如,如果一个字符串返回 -10 的哈希码,而另一个字符串返回的哈希码 10,则会发生错误。在我的系统中,我们谈论的对象集合通常不超过30个元素,所以我认为这不会是一个问题,但我很好奇数学是怎么说的。


答案 1

哈希代码可以被认为是伪随机数。从统计学上讲,当总体大小约为54K时,使用正哈希代码,任何两个元素之间发生冲突的几率达到50%(任何元素为77K)。请参阅生日问题概率表,了解各种哈希代码大小的冲突概率。intint

此外,您单独使用的想法是有缺陷的:它并不总是返回正数!在2的赞美算术中,绝对值是它本身!众所周知,的哈希代码是此值。Math.abs()Integer.MIN_VALUE"polygenelubricants"


答案 2

哈希不是唯一的,因此它们不是 uniqueId 专有的。

至于哈希冲突的概率,你可以读到生日悖论。实际上(根据我的记忆),当从N个值的均匀分布中绘制时,您应该在绘制$\sqrt(N)$之后预期会发生碰撞(您可能会更早地发生碰撞)。问题在于Java的实现(特别是在散列短字符串时)不提供均匀分布,因此您将更早地遇到冲突。hashCode