标题基本上说这一切。我试过谷歌搜索,但返回一大堆误报。我想我只是想知道这两个具体数字背后是否存在某种基本原理,或者他们是否可以很容易地使用其他许多数字?为什么Eclipse生成的equals会有什么特别的原因,为布尔值使用1231和1237的值?
编辑:而且,由于数字的来源已被回答,所以布尔hashCode方法的作者使用这些数字(除了它们是素数)之外的任何原因?其他任何一组素数都可以工作吗?
标题基本上说这一切。我试过谷歌搜索,但返回一大堆误报。我想我只是想知道这两个具体数字背后是否存在某种基本原理,或者他们是否可以很容易地使用其他许多数字?为什么Eclipse生成的equals会有什么特别的原因,为布尔值使用1231和1237的值?
编辑:而且,由于数字的来源已被回答,所以布尔hashCode方法的作者使用这些数字(除了它们是素数)之外的任何原因?其他任何一组素数都可以工作吗?
哈希函数容易出现collisions。通过使用素数可以减少碰撞次数(考虑素数有的因素)。 1231和1237都是素数。
/E1
做了进一步的研究之后我碰到this:
因为他们很可能会与 哈希表大小没有公约数(除黄金本身divises哈希表的大小),在常见散列表实现中碰撞的机会将最小化为 。
所以这两个没什么特别的,只是它们是素数?那么,11和17会一样好? – AHungerArtist
@AHungerArtist素数越大,功能就越安全。据我所知,这有其根源在密码学中,大素数乘以一起产生更大(且相当安全)的密钥。 – Jeffrey
@AHungerArtist事实证明,在发生碰撞之前,哈希表越大,散列表必须越大。在这种情况下,哈希表将在发生冲突之前拥有2462(2 * 1231)个存储桶。 为什么java的开发人员选择*这些*素数是一个最好留给他们的问题。 – Jeffrey
他们来自布尔hashCode方法。它们只是2个大的任意素数。请参阅Boolean.hashCode()
它们显然是调用Java核心Boolean class hashCode()
results的捷径。
返回: 如果此对象表示为真,则为整数1231;如果此对象表示为false,则返回整数1237。
可以找到更深入的讨论(尽管只是以假设而不是硬性的事实结束)可以找到here。
这仍然存在问题,这些问题来自哪里以及为什么。
也许是他们是从某人的办公室到工作人员自助餐厅的步数的最佳估计。或某人的女友朋友的电话号码。谁知道。
底线是,除非你追踪原始(Sun)作者并询问他们,否则你永远不会知道真实的答案。 (我假设他们还记得真正的答案,并准备告诉你!)
让待着......
他们都是质数,如果这是任何帮助。 –
[Boolean.hashCode()](http://stackoverflow.com/questions/3912303/boolean-hashcode) – assylias