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

Chr*_*lor 4 ruby hash

为什么Ruby的散列一个整数n2 * n + 1

>> [0,1,2,3].each {|x| puts x.hash}
1
3
5
7
Run Code Online (Sandbox Code Playgroud)

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

>>> map(hash,[0,1,2,3])
[0, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

有原因吗?

ste*_*lag 5

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

10.times{|i| puts i.object_id}
Run Code Online (Sandbox Code Playgroud)

输出:

1
3
5
7
9
11
13
15
17
19
Run Code Online (Sandbox Code Playgroud)

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

  • 所以它基本上是希尔伯特酒店的物件ID.;-) (5认同)