$arr=[0=>'foo',2=>'abc'],foo在第0个位置,第一个位置为空,abc在第二个位置,之后变成hash array ,此时foo在第0个位置,abc在第一个位置,bar在第二个位置。
问题一:$arr[2]取得值是‘abc’还是‘bar’?
问题二:‘abc’对应的key是‘2’还是对应的‘h’是‘2’?
问题一:$arr[2]取得值是‘abc’还是‘bar’? 使用$arr[2]取的值还是‘abc’ 但是请注意,在底层的hashtable中,abc被放在第1个位置,当我们通过$arr[2]取值的时候, h值是2,2|-8=-6 从前面的索引数组中取-6的位置,是1; 然后从arData[1]取出来,h=2跟我们的$arr[2]里面的2相等,这时候没有发生冲突,因此,值就是我们要的,可以打印出来就是"abc",具体可以看下图:
问题二:从上图可以看出, "abc"对应的key是0x0 h是2.
看一下是不是能解决你的疑问呢?
如果是packed array ‘h’和idx是对应的。如果是hash array 则是通过(如果关联数组,则用key经过hash函数计算出h)‘h’或运算计算出nIndex,再通过nIndex中保存的idx值找到对应的位置。
---这句话完全正确的。 packed array就是按照idx取。 hash array就是hashtable了,要计算对应的位置的。
‘foo’存储在idx='0'的位置是因为h='0'或运算-16得到nIndex='-16',该索引存储的idx值为0,所以'foo'才存储在0的位置。与packed array 存储在同一个位置。
-- 这个有一点点小问题, 对于hashtable是8个大小的时候就是0|-8 在第-8个索引位置; 你说的应该是扩容一倍以后,变成了hashtable是16个大小了。 公式就是nIndex = h | ht->nTableMask;