【发布时间】:2013-10-13 02:51:14
【问题描述】:
我现在知道一些内置实用程序,例如来自 Apache commons lang 的 HashCodeBuilder,但我试图了解如何自己实现它,并在http://en.wikipedia.org/wiki/Java_hashCode()遇到了 Employee 类的 hascode 函数示例
在谷歌的任何地方,都建议使用相同的技术,例如将非零值与奇质数相乘,然后将其相加 使用实例变量(对实例变量执行此操作)。
问题:-
1) 为什么我们不能将employeeId 作为hascode 返回,因为它会是唯一的。它简单并且服务于hascode目的。 同意,如果它不是唯一的,我们可能需要这种技术。对吗?
2)即使员工ID不是唯一的,为什么建议乘以奇数素数?为什么取任何该死的整数不是 算好的吗?
更新:-
Peter 我运行了你提到的打印示例
[0, 32, 64, 96, 128, 160, 192, 224, 288, 256, 352, 320, 384]
[0, 32, 64, 96, 128, 160, 192, 224, 288, 256, 352, 320, 384]
我假设现在的输出与预期的一样理解这个概念 正如您在回答中提到的那样
[373, 343, 305, 275, 239, 205, 171, 137, 102, 68, 34, 0]
[0, 34, 68, 102, 137, 171, 205, 239, 275, 305, 343, 373]
正如您在评论中所建议的那样,此示例表明即使是唯一的哈希码也可以最终出现在同一个存储桶中。这怎么 示例证明了这种行为?您的意思是整数 373 和整数 0 最终在同一个桶中吗?
素数在本例中有何帮助,而 34 又有何帮助?
【问题讨论】:
标签: java hashcode hash-collision hash-code-uniqueness