Sobes.tech
Junior

Šta znaš o hash funkcijama?

sobes.tech АИ

Одговор од АИ

Hash funkcija (hash funkcija) — to je funkcija koja pretvara ulazne podatke (bilo koje veličine) u izlazni niz fiksne veličine, nazvan hash ili sažetak poruke.

Osobine hash funkcija:

  • Determinističnost: Isti ulaz uvek daje isti hash.
  • Efikasnost izračunavanja: Izračunavanje hasha treba biti brzo.
  • Osetljivost na promene: Čak i mala promena ulaznih podataka treba da dovede do značajne promene u hashu ("efekat lavine").
  • Jednosmernost: Praktično je nemoguće rekonstruisati originalne podatke iz hasha.
  • Otpornost na kolizije: Trebalo bi biti veoma teško pronaći dva različita poruka koja daju isti hash.

Tipovi hash funkcija:

  • Kriptografske hash funkcije: Koriste se u kriptografiji za obezbeđivanje integriteta podataka, digitalne potpise (MD5, SHA-1, SHA-256, SHA-3). MD5 i SHA-1 se smatraju manje sigurnim zbog pronađenih ranjivosti.
  • Ne-kriptografske hash funkcije: Koriste se za ubrzanje pretraživanja podataka (npr. u hash tabelama), kontrolne sume (CRC32). Nemaju osobine otpornosti na kolizije ili jednosmernosti.

Primena hash funkcija u Pythonu:

  • Hash tabele (rečići): Interno koriste hashiranje za brzi pristup elementima po ključu. Ključevi moraju biti hash-abilni (nepromenljivi).
  • Skupovi (sets): Slično, koriste hashove za skladištenje jedinstvenih elemenata.
  • Provera integriteta fajlova: Upoređivanje hash-ova pre i posle prenosa podataka.
  • Čuvanje lozinki: Umesto da čuvaju same lozinke, čuvaju njihove hash vrednosti (sa solju za otežavanje napada putem rečnika).
  • Kriptografske operacije: Biblioteka hashlib pruža pristup različitim kriptografskim hash funkcijama.

Primer korišćenja hashlib:

import hashlib

data = b"Hello, world!" # Ulazni podaci moraju biti u bajtovima
sha256_hash = hashlib.sha256(data).hexdigest()

print(f"SHA-256 hash za '{data.decode()}': {sha256_hash}")

# Primer promene podataka
data_changed = b"Hello, world!!"
sha256_hash_changed = hashlib.sha256(data_changed).hexdigest()

print(f"SHA-256 hash za '{data_changed.decode()}': {sha256_hash_changed}") # Hash će se značajno promeniti

Svojstva hashabilnih objekata u Pythonu:

  • Objekat mora imati metodu __hash__, koja vraća celo broj.
  • Objekat mora imati metodu __eq__ za poređenje na jednakost.
  • Ako a == b, onda hash(a) mora biti jednako hash(b).
  • Obično, samo nemodifikovani (immutable) objekti (nizovi, brojevi, torke) su hashabilni po defaultu. Modifikovani objekti (liste, rečnici) nisu hashabilni.