为什么Ruby将FixNum n哈希为2n + 1?

为什么Ruby将整数n散列为2 * n + 1

 >> [0,1,2,3].each {|x| puts x.hash} 1 3 5 7 

我可以看到你并不总是需要复杂的哈希值,特别是对于简单的对象。 但是为什么’double和add 1’规则而不是做Python所做的,那就是将整数哈希给自己?

 >>> map(hash,[0,1,2,3]) [0, 1, 2, 3] 

有原因吗?

整数是对象,因此它们有一个object_id。 但是有无数个整数。 看似没有其他物品的空间。 Ruby如何解决这个问题?

 10.times{|i| puts i.object_id} 

输出:

 1 3 5 7 9 11 13 15 17 19 

整数占用所有奇怪的object_id,其余的对象介于两者之间,它们使用偶数。 从object_id(和hash)到整数(反之亦然)的转换非常简单:切断最右边的1位(或添加它)。