5.1 Heş-funksiya və onun tətbiqləri
Heş-funksiya — giriş məlumatlarını (və ya açarı) qəbul edən və sabit ölçülü bitlər qaytaran funksiya, adətən buna heş və ya heş-dəyəri deyilir. Heş-funksiya əsasən məlumatları heş-cədvəl üzrə effektiv şəkildə paylamaq üçün istifadə edilir ki, elementlərə tez bir zamanda giriş təmin edilsin.
Tətbiq sahələri:
- Heş-cədvəllər: Assosiativ massivlərin (Python-da dictionary-lər) reallaşdırılması üçün istifadə edilir, açar üzrə məlumatlara sürətli çıxış təmin edir.
- Məlumatın bütövlüyünə nəzarət: Heş-funksiyalar faylların və məlumatların bütövlüyünü yoxlamaq üçün istifadə edilir (məsələn, MD5, SHA-1, SHA-256 alqoritmləri).
- Kriptoqrafiya: Kriptoqrafik alqoritmlərdə şifrələmə və rəqəmsal imzaların yaradılması üçün istifadə olunur.
- Axtarış sistemləri: Məlumat indeksləşdirməsi və informasiyanın tez tapılması üçün tətbiq edilir.
- Keş idarəetməsi: Məlumatları tez tapmaq üçün keşlərin təşkili üçün istifadə olunur.
Python-da heş-funksiya tətbiqinə nümunə:
# Python-da heş-funksiya nümunəsi heş-cədvəlində (dictionary-də) istifadəsi
data = {"alma": 1, "banan": 2, "gilas": 3}
# Açarın heş-dəyərinin alınması
key = "banan"
hash_value = hash(key)
print(f"Açar üçün heş-dəyər '{key}': {hash_value}")
5.2 Real həyatdan analoqlar
Hash-funksiyanın köməyi ilə böyük bir obyekt qrupunu təxminən bərabər qruplara bölmək olar. Üstəlik, yeni obyektlər əlavə etməyə davam etsəniz, onlar qruplar üzrə bərabər yayılmağa davam edəcəklər.
Fərz edək ki, sizin 1000 nəfəriniz var və onları 30 qrupa bölmək lazımdır. Budur, bunu necə etmək olar.
Metod 1. Adın ilk hərfinə görə.
Birinci qrup - adı "A" ilə başlayanlar, ikinci qrup - adı "B" ilə başlayanlar və beləliklə davam edir. Qaydası "Sənin qrupun adının ilk hərfidir" - bu da hash-funksiya. Amma belə bir hash-funksiya ilə "A" qrupunda çox adam, "Ə" qrupunda isə az adam ola bilər.
Metod 2. Doğum tarixinə görə.
Hər hansı bir ayın birinci günündə doğulanlar - birinci qrup, ikinci günündə - ikinci və sairə. 31 ayırıcı qrup olacaq. 31-ci qrupda digər qruplardan təxminən 2 dəfə az adam olacaq, lakin belə qruplarda insanlar birinci vəziyyətdən daha bərabər paylanır.
Metod 3. Telefon nömrəsi
İdeal seçim bu cür rəqəm əldə etməkdir ki, bir tərəfdən mümkün qədər təsadüfi olsun (bu halda belə rəqəmlər bərabər yayılacaq), digər tərəfdən isə həmişə tez hesablanmaqla eyni qalmalıdır.
Gəlin telefon nömrəsinin son 4 rəqəmini götürək - bu, 10 000 variant olacaq. Sonra bu rəqəmi 30-a tam bölək. Beləliklə, 30 mümkün qalıq olacaq: 0, 1, 2, ..., 29. Bu da bizim qruplarımızın nömrələri olacaq.
Faydalı! Yeri gəlmişkən, demək olar ki, hər hansı bir hash-funksiya tam bölmənin qalıqlarını istifadə edir - bu, çox sadədir və elementləri bölmək lazım olan qrupların sayını tənzimləməyə imkan verir.
5.3 Hash-funksiya əsas xassələri
Yaxşı hash-funksiya əsas xassələri:
Determinasiya: Eyni hash-funksiya eyni giriş dəyəri üçün həmişə eyni hash dəyərini qaytarmalıdır.
Nümunə:
key = "example"
assert hash(key) == hash(key)
Vacibdir! Assert operatoru yoxlayır ki, sağ tərəfində olan ifadə True (doğru) olub. Əgər ifadə doğru deyilsə False, o zaman istisna atılır.
Bərabərlik: Yaxşı bir hash-funksiya hash-dəyərlərin mümkün diapazonu boyunca dəyərləri bərabər paylamalıdır ki, toqquşmalardan qaçsın.
Python-developerin təcrübəsindən nümunə: Python-un dicionary-də (dict class), hash-funksiya hash() açarları bərabər şəkildə paylayır.
Hesablama effektivliyi: Hash-funksiya sürətli və effektiv olmalıdır ki, daxil və axtarış əməliyyatlarını ləngitməsin.
Python-developerin təcrübəsindən nümunə: Python-da standart hash-funksiya müxtəlif tiplərdən olan açarlarla, məsələn, stringlər və rəqəmlər üçün işləyir.
Toqquşmaların minimallaşdırılması: Toqquşma iki müxtəlif açar eyni hash dəyərinə malik olduqda baş verir. Yaxşı hash-funksiya toqquşmaların ehtimalını minimallaşdırmalıdır.
Python-developerin təcrübəsindən nümunə: SHA-256 alqoritmi məlumatları hash-ləyərkən toqquşma ehtimalını minimallaşdırır.
Hashlərin paylanması: Böyük həcmli məlumatlar üçün hash-funksiya hash-dəyərlərin hash-cədvəl boyunca bərabər paylanmasını təmin etməlidir.
Python-developerin təcrübəsindən nümunə: Python-un standart hash-funksiyaları hash-cədvəldə açarların paylanması ilə yaxşı məşğul olur.
5.4 Hash-funksiya misalları və onların realizasiyası
Hash-funksiyalar giriş olaraq istənilən ölçüdə məlumat qəbul edir və sabit ölçüdə hash-dəyər qaytarır. Gəlin bir neçə hash-funksiya misalına və onların realizasiyasına baxaq.
Misal 1: Sətirlər üçün sadə hash-funksiya
Sətirlər üçün ən sadə hash-funksiya sətir simvollarının kodlarının cəmi ilə realizasiya edilə bilər:
def simple_hash(key):
hash_value = 0
for char in key:
hash_value += ord(char)
return hash_value % 1000 # Tutaq ki, cədvəlimizin ölçüsü 1000-dir
# İstifadə misalı:
key = "example"
print(f"Klüç üçün hash-dəyər '{key}': {simple_hash(key)}")
Misal 2: Polinomial hash-funksiya sətirlər üçün
Polinomial hashlaşdırma daha çətin, lakin effektiv texnikadır:
def polynomial_hash(key, a=33, m=1000):
hash_value = 0
for char in key:
hash_value = (hash_value * a + ord(char)) % m
return hash_value
# İstifadə misalı:
key = "example"
print(f"Klüç üçün hash-dəyər '{key}': {polynomial_hash(key)}")
Misal 3: Python-da daxili hash-funksiya
Python müxtəlif tip məlumatlar üçün hash-dəyər almaq üçün hash() adlı daxili funksiya təqdim edir:
key = "example"
print(f"Klüç üçün hash-dəyər '{key}': {hash(key)}")
Misal 4: Kriptoqrafik hash-funksiya (SHA-256)
SHA-256 kimi kriptoqrafik hash-funksiyalar məlumatların təhlükəsizliyini təmin etmək üçün istifadə olunur:
import hashlib
def sha256_hash(key):
return hashlib.sha256(key.encode()).hexdigest()
# İstifadə misalı:
key = "example"
print(f"Klüç üçün hash-dəyər '{key}': {sha256_hash(key)}")
5.5 Hashlama və onun tətbiqi ilə tanışlıq
Hashlama — bu, giriş məlumatlarının təsadüfi ölçülərindən müəyyən ölçülü hash dəyərinə çevrilməsi prosesidir, bu zaman hash-funksiyasından istifadə olunur. Hashlama kompüter elmlərində və proqramlaşdırmada optimallaşdırma və təhlükəsizlik üçün geniş istifadə olunur.
Hashlamanın əsas tətbiqləri:
1. Hash cədvəlləri (sözlüklər): Hash cədvəlləri məlumatların təşkil edilməsi və onlara sürətli giriş üçün hash-funksiyalardan istifadə edir.
data = {"alma": 1, "banan": 2, "albalı": 3}
key = "banan"
hash_value = hash(key)
print(f"Kiril üçün hash dəyəri '{key}': {hash_value}")
2. Məlumatların bütövlüyünə nəzarət: Hash-funksiyalar faylların və məlumatların bütövlüyünün yoxlanılması üçün istifadə olunur.
Nümunə: SHA-256 vasitəsilə fayl bütövlüyünün yoxlanması:
import hashlib
def get_file_hash(file_path):
hasher = hashlib.sha256()
with open(file_path, 'rb') as file:
buf = file.read()
hasher.update(buf)
return hasher.hexdigest()
file_hash = get_file_hash('example.txt')
print(f"SHA-256 fayl hash dəyəri: {file_hash}")
3. Kriptografiya və təhlükəsizlik: Hash-funksiyalar rəqəmsal imzalar və parol hash-ləri kimi kriptoqrafik primitivlərin yaradılması üçün istifadə olunur.
Nümunə: SHA-256 vasitəsilə parol hashlaması:
import hashlib
def hash_password(password):
return hashlib.sha256(password.encode()).hexdigest()
password = "guvenliparol"
hashed_password = hash_password(password)
print(f"Parol hash dəyəri: {hashed_password}")
4. Axtarış sistemləri və indeksləşdirmə: Hashlama indekslərin yaradılması və məlumatların sürətli axtarışı üçün istifadə olunur.
Nümunə: Mətn üçün indeks yaratmaq:
def create_index(text):
index = {}
for word in text.split():
word_hash = hash(word)
if word_hash not in index:
index[word_hash] = []
index[word_hash].append(word)
return index
text = "Bu indeksləşdirmə üçün nümunə bir mətn"
index = create_index(text)
print(f"İndeks: {index}")
5. Keşin idarə edilməsi: Hashlama keşlərin təşkil edilməsi və məlumatların sürətli tapılması üçün istifadə olunur.
Nümunə: Hash-funksiyası ilə sadə bir keş:
cache = {}
def get_from_cache(key):
hash_key = hash(key)
return cache.get(hash_key, None)
def add_to_cache(key, value):
hash_key = hash(key)
cache[hash_key] = value
# Keşə məlumat əlavə etmək və götürmək
add_to_cache("test_key", "test_value")
print(get_from_cache("test_key")) # Çıxış: test_value
GO TO FULL VERSION