tophash
Выше было упомянуто, что это "единственное" поле бакета имеет тип [8]uint8. На самом деле, это многоцелевое поле, потому что сразу двум целям служит:
- Если значение элемента больше пяти - это верхние 8 бит (в противовес нижним для адресации) хэша хранящегося там ключа;
- Если же меньше пяти, то это так званое "специальное значение" - обозначая, к примеру, что слот для ключ-значения пустует, или сообщает об эвакуации (на самом деле, если бакет эвакуируется, то ВСЕ tophash значения будут выставлены в evacuated*, а не только конкретные слоты);
Из рационального невежества, я не планирую освещать тему эвакуации. В основном потому, что я в ней и сам не разобрался, да и не сильно желанием горю - мне главное саму концепцию себе спиздить.
Кстати, ещё из интересного - когда верхний байт хэша таки меньше пяти, к нему просто прибавляют пять. Так и гарантируют.
Но помимо флагов, tophash выполняет ещё и очень полезную функцию. А именно - вместо того, чтобы напрямую сравнивать каждый ключ с искомым, мы сначала сверяем верхние байты их хэшей. Так сделано потому, что некоторые ключи сравнивать - очень дорого. Строки, например.
Post #493
202
- 👍 2
- 🤔 1