Sobes.tech
Junior

Co je to hash a jak se používá ve slovnících v Pythonu?

sobes.tech AI

Odpověď od AI

Hash (nebo hash-hodnota) je číselná hodnota pevnej dĺžky, ktorá je vypočítaná na základe obsahu objektu pomocou hashovacej funkcie. Dobrá hashovacia funkcia zabezpečuje deterministickosť (t.j. ten istý objekt vždy dá rovnaký hash) a snaží sa o rovnomerné rozloženie hashov pre rôzne objekty.

V Pythone používajú slovníky (typ dict) hashovanie na efektívne ukladanie a vyhľadávanie párov "kľúč-hodnota". Kľúče v slovníku musia byť hashovateľné, teda musia mať metódu __hash__() a byť nemenné alebo mať implementáciu __eq__() a __hash__(), ktorá zabezpečuje, že objekty rovnakej hodnoty majú rovnaký hash.

Proces práce slovníka s hashmi:

  1. Vkladanie: Pri pridávaní páru (kľúč, hodnota) sa vypočíta hash kľúča. Na základe hash sa určí približné miesto (košík alebo "bucket") na uloženie tohto páru v pamäti. Ak má viacero kľúčov rovnaký hash (kolízia), páry sa ukladajú do tohto košíka, často vo forme prepojeného zoznamu alebo iného mechanizmu riešenia kolízií.
  2. Vyhľadávanie: Pri hľadaní hodnoty podľa kľúča sa vypočíta hash odovzdaného kľúča. Pomocou hash sa rýchlo nájde príslušný košík. Potom v tomto košíku prebieha porovnanie kľúčov (pomocou metódy __eq__()) na nájdenie požadovaného kľúča a získanie s ním spojené hodnoty.

Výhody hashovania:

  • Efektivita: Priemerné operácie vkladania, odstraňovania a vyhľadávania v slovníku majú konštantnú časovú zložitosť O(1), nezávisle od veľkosti slovníka.
  • Rýchly prístup: Hash umožňuje rýchlo sa dostať na predpokladané miesto uloženia dát, čím sa obchádza prehľadávanie všetkých prvkov.

Obmedzenia a vlastnosti:

  • Hashovateľné kľúče: Ako bolo spomenuté, kľúče musia byť hashovateľné. Menné typy, ako zoznamy (list) a množiny (set), nie sú hashovateľné podľa predvoleného nastavenia a nemôžu byť použité ako kľúče v slovníku.
  • Kolízie: Hoci hashovacie funkcie sa snažia minimalizovať kolízie, môžu sa vyskytnúť, čo môže mierne spomaliť operácie v najhoršom prípade (ovplyvňuje konštantu v O(1)).
  • Poradie: Do Pythonu 3.7 závisel poradie prvkov v slovníku od poradia vloženia a hashov kľúčov. Od verzie 3.7 slovníky zachovávajú poradie vloženia kľúčov ako vedľajší efekt implementácie, ale nie je to súčasť mechanizmu hashovania.

Príklad hashovateľného a nehashovateľného objektu:

# Hashovateľný objekt (nemenný)
string_key = "hello"
int_key = 123
tuple_key = (1, 2)

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

# Nehashovateľný objekt (meniteľný)
list_key = [1, 2]
# print(hash(list_key)) # Vyvolá TypeError

# Príklad použitia v slovníku
my_dict = {
    string_key: "world",
    int_key: 456,
    tuple_key: "tuple"
}

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

Hash je teda základný mechanizmus, ktorý umožňuje slovníkom v Pythone dosahovať vysokú výkonnosť operácií na základe rýchleho výpočtu číselného zobrazenia kľúča.