使用哈希码获取唯一ID

Ice*_*nte 10 java unique hashcode

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

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

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

Boh*_*ian 11

哈希码可以被认为是伪随机数.统计上,使用正int哈希码,当群体大小约为54K(任何时候 为77K int)时,任何两个元素之间发生冲突的可能性达到50%.有关各种哈希码大小的冲突概率,请参阅生日问题概率表.

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


jb.*_*jb. 7

哈希不是唯一的,因此它们不适合uniqueId.

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