第6节中变成hash array之后,对于字符串‘abc’的bucket来说,‘key’和‘h’的值那个是‘2’?
$arr=[0=>'foo',2=>'abc'],foo在第0个位置,第一个位置为空,abc在第二个位置,之后变成hash array ,此时foo在第0个位置,abc在第一个位置,bar在第二个位置。
问题一:$arr[2]取得值是‘abc’还是‘bar’?
问题二:‘abc’对应的key是‘2’还是对应的‘h’是‘2’?
$arr=[0=>'foo',2=>'abc'],foo在第0个位置,第一个位置为空,abc在第二个位置,之后变成hash array ,此时foo在第0个位置,abc在第一个位置,bar在第二个位置。
问题一:$arr[2]取得值是‘abc’还是‘bar’?
问题二:‘abc’对应的key是‘2’还是对应的‘h’是‘2’?
2019-01-03
如果是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;
举报