为什么Ruby的散列一个整数n来2 * 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)
有原因吗?
整数是对象,因此它们有一个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位(或添加它)切掉.
| 归档时间: |
|
| 查看次数: |
201 次 |
| 最近记录: |