第6節(jié)中變成hash array之后,對于字符串‘abc’的bucket來說,‘key’和‘h’的值那個是‘2’?
$arr=[0=>'foo',2=>'abc'],foo在第0個位置,第一個位置為空,abc在第二個位置,之后變成hash array? ,此時foo在第0個位置,abc在第一個位置,bar在第二個位置。
問題一:$arr[2]取得值是‘a(chǎn)bc’還是‘bar’?
問題二:‘a(chǎn)bc’對應(yīng)的key是‘2’還是對應(yīng)的‘h’是‘2’?
2019-01-03
問題一:$arr[2]取得值是‘a(chǎn)bc’還是‘bar’?? ? ? ? 使用$arr[2]取的值還是‘a(chǎn)bc’? 但是請注意,在底層的hashtable中,abc被放在第1個位置,當(dāng)我們通過$arr[2]取值的時候, h值是2,2|-8=-6 從前面的索引數(shù)組中取-6的位置,是1;? 然后從arData[1]取出來,h=2跟我們的$arr[2]里面的2相等,這時候沒有發(fā)生沖突,因此,值就是我們要的,可以打印出來就是"abc",具體可以看下圖:
問題二:從上圖可以看出, "abc"對應(yīng)的key是0x0? h是2.
看一下是不是能解決你的疑問呢?
2019-01-03
如果是packed array ‘h’和idx是對應(yīng)的。如果是hash array 則是通過(如果關(guān)聯(lián)數(shù)組,則用key經(jīng)過hash函數(shù)計算出h)‘h’或運算計算出nIndex,再通過nIndex中保存的idx值找到對應(yīng)的位置。
---這句話完全正確的。 packed array就是按照idx取。? hash array就是hashtable了,要計算對應(yīng)的位置的。
‘foo’存儲在idx='0'的位置是因為h='0'或運算-16得到nIndex='-16',該索引存儲的idx值為0,所以'foo'才存儲在0的位置。與packed array 存儲在同一個位置。
-- 這個有一點點小問題, 對于hashtable是8個大小的時候就是0|-8? 在第-8個索引位置;? 你說的應(yīng)該是擴容一倍以后,變成了hashtable是16個大小了。? ?公式就是nIndex = h | ht->nTableMask;?