Sobes.tech
Junior

Mis on hash ja kuidas seda kasutatakse Python sõnaraamatutes?

sobes.tech AI

Vastus AI-lt

Hash (või hash-väärtus) on fikseeritud pikkusega arvväärtus, mis arvutatakse objekti sisu põhjal hash-funktsiooni abil. Hea hash-funktsioon tagab determinismi (st sama objekt annab alati sama hash-väärtuse) ja püüab saavutada ühtlase jaotumise erinevate objektide vahel.

Pythonis kasutavad sõnastikud (dict tüüp) hashimist tõhusaks "võtme- väärtuse" paaride salvestamiseks ja otsimiseks. Võtmed peavad olema hash-üles töötavad, st neil peab olema __hash__() meetod ning nad peavad olema muutumatud või omama __eq__() ja __hash__() realiseerimist, mis tagab, et võrdsed objektid omavad sama hash-väärtust.

Sõnastiku hashimise protsess:

  1. Lisamine: Kui lisatakse paar (võti, väärtus), arvutatakse võtme hash. Hashi põhjal määratakse umbkaudne koht (kott või "buket") selle paari salvestamiseks mälus. Kui mitu võtit omavad sama hash (kolleksioon), salvestatakse need selles kotis, sageli seotud nimekirja või muu kolleksiooni lahendusena.
  2. Otsing: Otsides väärtust võtme järgi, arvutatakse antud võtme hash. Hashi abil leitakse kiiresti vastav kott. Seejärel toimub selle koti sees võrdlus (__eq__()), et leida vajalik võti ja saada sellega seotud väärtus.

Hashimise eelised:

  • Tõhusus: Keskmiselt teostatakse lisamise, kustutamise ja otsimise operatsioone sõnastikus konstantse ajaga O(1), sõltumata sõnastiku suurusest.
  • Kiire juurdepääs: Hash võimaldab kiiresti liikuda andmete oletatavale asukohale, vältides kõigi elementide läbivaatamist.

Piirangud ja omadused:

  • Hash-üles töötavad võtmed: Nagu mainitud, peavad võtmed olema hash-üles töötavad. Muutuvad tüübid, nagu nimekirjad (list) ja kogumid (set), ei ole vaikimisi hash-üles töötavad ning neid ei saa kasutada võtmetena.
  • Kolleksioonid: Kuigi hash-funktsioonid püüavad minimeerida kolleksioone, võivad need tekkida, mis võib mõnevõrra aeglustada operatsioone halvimatel juhtudel (mõjutab O(1) konstant).
  • Järjepidevus: Python 3.7-ni, sõnastiku elementide järjekord sõltus sisestamise järjekorrast ja hash- väärtustest. Alates 3.7, säilitavad sõnastikud sisestamise järjekorra, mis on kõrvalmõju teostusest, kuid see ei ole hash-mehhanismi osa.

Näide hash-üles töötavast ja mitte-hash-üles töötavast objektist:

# Hash-üles töötav objekt (muutmatu)
string_key = "hello"
int_key = 123
tuple_key = (1, 2)

print(hash(string_key))
print(hash(int_key))
print(hash(tuple_key))

# Mitte-hash-üles töötav objekt (muutuv)
list_key = [1, 2]
# print(hash(list_key)) # Annab TypeError

# Näide kasutamisest sõnastikus
my_dict = {
    string_key: "world",
    int_key: 456,
    tuple_key: "tupel"
}

print(my_dict[string_key])
print(my_dict[int_key])
print(my_dict[tuple_key])

Seega on hash põhimõtteliselt mehhanism, mis võimaldab Python sõnastikel saavutada kõrget jõudlust operatsioonides, mis põhinevad kiirel võtme arvulisel esitusel.