Sobes.tech
Junior

Hash nədir və Python-da sözlüklərdə necə istifadə olunur?

sobes.tech Süni İntellekt

AI-dan cavab

Hash (və ya hash dəyəri) obyektin məzmununa əsaslanan və hash funksiyası vasitəsilə hesablanan sabit uzunluqlu ədədi dəyərdir. Yaxşı hash funksiyası deterministikliyi təmin edir (eyni obyekt həmişə eyni hash verir) və müxtəlif obyektlər üçün bərabər paylanma hədəfləyir.

Python-da sözlüklər (tip dict) hash istifadə edərək səmərəli şəkildə "açar-dəyər" cütlüklərini saxlama və axtarış edir. Açarlar hash edilə bilən olmalıdır, yəni __hash__() metoduna sahib olmalı və dəyişməz və ya __eq__()__hash__() implementasiyasına malik olmalı, belə ki, __eq__() ilə bərabər olan obyektlər eyni hash-ə malik olmalıdır.

Hash ilə sözlük işləmə prosesi:

  1. Əlavə: Bir cüt (açar, dəyər) əlavə edilərkən, açarın hash-i hesablanır. Hash-ə əsasən, bu cütlük üçün təxmini yer (kova və ya "bucket") müəyyən edilir. Əgər bir neçə açar eyni hash-ə malikdirsə (kolliziya), cütlüklər bu kovada saxlanılır, çox vaxt əlaqəli siyahı və ya başqa kolliziya həll mexanizmi şəklində.
  2. Axtarış: Bir dəyər axtararkən, verilmiş açarın hash-i hesablanır. Hash istifadə edilərək, sözlük sürətlə uyğun kovanı tapır. Sonra, həmin kovada açarlar __eq__() metodu ilə müqayisə edilir və düzgün açar tapılaraq onunla əlaqəli dəyər alınır.

Hash istifadə etmənin üstünlükləri:

  • Effektivlik: Orta hesabla, sözlükdə əlavə etmə, silmə və axtarış əməliyyatları sabit vaxt O(1) ilə həyata keçirilir, sözlük ölçüsündən asılı deyil.
  • Sürətli giriş: Hash məlumatların ehtimal olunan yerinə sürətlə keçməyə imkan verir, bütün elementləri yoxlamadan.

Məhdudiyyətlər və xüsusiyyətlər:

  • Hash edilə bilən açarlar: Yadda saxlanılmalıdır ki, açarlar hash edilə bilən olmalıdır. Dəyişən tiplər, məsələn, siyahılar (list) və toplular (set) standart olaraq hash edilə bilməz və açar kimi istifadə oluna bilməz.
  • Kolliziyalar: Hash funksiyaları kolliziya minimuma endirməyə çalışsa da, baş verə bilər və bu, ən pis halda əməliyyatları bir az yavaşlada bilər (O(1) sabitinə təsir edir).
  • Sıra: Python 3.7-yə qədər, sözlükdə elementlərin sırası, əlavə edilmə sırasına və açarların hash-lərinə bağlı idi. 3.7-dən sonra, sözlüklər əlavə edilmə sırasını saxlayır, bu isə implementasiyanın yan təsiridir, lakin bu, hash mexanizmasının bir hissəsi deyil.

Hash edilə bilən və edilə bilməyən obyekt nümunələri:

# Hash edilə bilən obyekt (dəyişməz)
string_key = "salam"
int_key = 123
tuple_key = (1, 2)

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

# Hash edilə bilməyən obyekt (dəyişkəndir)
list_key = [1, 2]
# print(hash(list_key)) # Bu, TypeError verəcək

# Sözlükdə istifadə nümunəsi
my_dict = {
    string_key: "dünya",
    int_key: 456,
    tuple_key: "bir tuple"
}

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

Beləliklə, hash, Python sözlüklərinin yüksək performans əldə etməsinə imkan verən əsas mexanizmdir, bu da açarın sürətli hesablanmasına əsaslanır.