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

时间:2012-02-09 21:19:07

标签: ruby hash

为什么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]

有原因吗?

1 个答案:

答案 0 :(得分:5)

整数是对象,因此它们有一个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位(或添加它)。