在擴容和收縮的時候,如果哈希字典中有很多元素,一次性將這些鍵全部rehash到ht[1]的話,可能會導致服務器在一段時間內停止服務。所以,采用漸進式rehash的方式,詳細步驟如下:
- 為
ht[1]分配空間,讓字典同時持有ht[0]和ht[1]兩個哈希表 - 將
rehashindex的值設置為0,表示rehash工作正式開始 - 在rehash期間,每次對字典執行增刪改查操作是,程序除了執行指定的操作以外,還會順帶將
ht[0]哈希表在rehashindex索引上的所有鍵值對rehash到ht[1],當rehash工作完成以后,rehashindex的值+1 - 隨着字典操作的不斷執行,最終會在某一時間段上
ht[0]的所有鍵值對都會被rehash到ht[1],這時將rehashindex的值設置為-1,表示rehash操作結束
漸進式rehash采用的是一種分而治之的方式,將rehash的操作分攤在每一個的訪問中,避免集中式rehash而帶來的龐大計算量。
需要注意的是在漸進式rehash的過程,如果有增刪改查操作時,如果index大於rehashindex,訪問ht[0],否則訪問ht[1]
