為什麼unordered_map桶的大小是8?

2020-10-04 12:00:19

其實還是因為泊松分佈。
雜湊,又似裡!
STL中的hashmap就是unordered_map。它記錄的鍵是元素的雜湊值,通過對比元素的雜湊值來確定元素的值。unordered_map的底層實現是hashtable,採用開鏈法(也就是用桶)來解決雜湊衝突,當桶的大小超過8時,就自動轉為紅黑樹進行組織。而轉換為紅黑樹,尤其是紅黑樹的插入刪除遍歷的複雜度最壞時間複雜度都是log(n),一旦轉為紅黑樹雜湊表的效能將大大降低,所以只有桶中包含足夠多的元素以供使用時,我們才會使用rbtree。那為什麼這個數位是8呢?
官方給出這樣一張表:

0: 0.60653066
1: 0.30326533
2: 0.07581633
3: 0.01263606
4: 0.00157952
5: 0.00015795
6: 0.00001316
7: 0.00000094
8: 0.00000006

即,在理想情況下,在隨機雜湊程式碼下,桶中的節點頻率遵循泊松分佈,而經過統計,桶的長度超過8的概率非常非常小。所以8是一個合理的選擇。