Sobes.tech
Middle

Ako funguje Map v Go?

sobes.tech AI

Odpoveď od AI

Map v Go je implementovaný ako hash tabuľka.

Hlavné komponenty štruktúry map:

  • Hash funkcia: Mapuje kľúče na hash hodnoty (celé čísla).
  • Pole košíkov (buckets): Súbor zoznamov alebo polí, kde sú uložené páry kľúč-hodnota. Index košíka je určený hash hodnotou kľúča.
  • Spracovanie kolízií: Pri zhode hashov pre rôzne kľúče (kolízia) sú prvky s týmito kľúčmi uložené v jednom košíku, zvyčajne vo viazanom zozname alebo pretečení do susedného košíka.
  • Zaťažovací faktor: Pomery medzi počtom prvkov a počtom košíkov. Pri prekročení určitého prahu dochádza k rehashovaniu – vytvoreniu nového, väčšieho poľa košíkov a presunu všetkých prvkov zo starých košíkov do nových.

Štruktúra map v Go je reprezentovaná typom hmap:

type hmap struct {
    count     int // Počet prvkov
    flags     uint8 // Stavové vlajky
    B         uint8 // log_2 počtu košíkov (počet košíkov je 2^B)
    noverflow uint16 // Počet pretečených košíkov (len pre štatistiku)
    hash0     uint32 // Počiatočná hodnota hash funkcie

    buckets    unsafe.Pointer // ukazovateľ na pole košíkov (hlavné a pretečené)
    oldbuckets unsafe.Pointer // ukazovateľ na staré pole košíkov počas migrácie
    nevacuate  uintptr // Označuje, do ktorého starého košíka bola migrácia dokončená

    extra *mapextra // Dodatočné informácie (voliteľné)
}

type mapextra struct {
    overflow    *[2]*[]*bmap // Ukazovatele na pole pretečených košíkov
    oldoverflow *[2]*[]*bmap // Ukazovatele na staré pole pretečených košíkov
    nextOverflow *bmap // Nasledujúci voľný pretečený košík
}

type bmap struct {
    tophash [8]uint8 // Top hash (horné bity hashu) pre zrýchlenie vyhľadávania v košíku
    // Nasledujú kľúče, hodnoty a ukazovateľ na ďalší bmap (ak je košík pretečený)
    // rozloženie všetkých dát pre hmap.buckets v jednom malloc bloku
    // pozrite ../../runtime/map.go pre detaily
}