La crittografia è la possibilità di nascondere delle informazioni per garantire la riservatezza dei dati, viene usata per evitare che altre persone possono avere accesso ai dati riservati.
Esistono diversi tipi di crittografia: 
- Hashing
- Crittografia simmetrica
- Crittografia asimmetrica
L’hashing è una funzione matematico non invertibile, che mappa una stringa di una lunghezza predefinita e viene usata per verificare se un certo file scaricato da internet sia ‘originale’ o sia stato ‘modificato’ da qualcuno.
Gli algoritmi di hashing più utilizzati sono :
Hashing a chiave singola
- Hashing diretto: Assegna direttamente la chiave come indirizzo della memoria. Funziona bene con un set di chiavi limitato e distribuito uniformemente.
- Hashing con catena: Crea una lista collegata per ogni indirizzo di memoria e memorizza gli elementi con la stessa chiave nella lista. Gestisce le collisioni ma può rallentare l’accesso in caso di liste lunghe.
- Hashing con indirizzamento aperto: Trova un indirizzo libero vicino alla chiave hash se l’indirizzo originale è già occupato. Richiede tecniche come l’indirizzamento lineare, l’indirizzamento quadratico o l’indirizzamento doppio hash.
- Hashing universale: Utilizza una famiglia di funzioni hash per minimizzare il numero di collisioni. Offre una maggiore sicurezza contro gli attacchi mirati.
Hashing a chiave multipla
- Hashing perfetto: Garantisce che non ci siano collisioni. Richiede una conoscenza preventiva delle chiavi e può essere inefficiente per set di chiavi dinamici.
- Hashing cuckoo: Utilizza due funzioni hash e sposta gli elementi tra le tabelle hash fino a trovare una posizione libera. Può essere efficiente ma il comportamento peggiore potrebbe essere disastroso.
- Hashing di Bloom: Verifica se un elemento è presente in un set, ma non può restituire l’elemento stesso. Utilizza una tabella di bit per memorizzare le informazioni e può essere molto efficiente in termini di memoria.
Tecniche hash
- Hashing di divisione: Calcola il resto della divisione della chiave per un numero primo. Semplice e veloce, ma può essere sensibile alla distribuzione delle chiavi.
- Hashing moltiplicativo: Moltiplica la chiave per un numero costante e poi estrae una parte del prodotto. Più robusto della divisione ma richiede più calcoli.
- Hashing con tabulazione: Utilizza una tabella precalcolata per mappare i caratteri della chiave a numeri e quindi somma i numeri per ottenere l’hash. Veloce ed efficiente, ma richiede più memoria.
- Hashing di crittografia: Utilizza funzioni hash crittografiche come SHA-256 o MD5 per garantire l’integrità dei dati e la resistenza agli attacchi.
La scelta del tipo di hashing dipende da vari fattori, tra cui:
- Il tipo di dati e la distribuzione delle chiavi
- La dimensione del set di dati
- Le prestazioni richieste
- I requisiti di sicurezza
Ecco alcuni esempi di come vengono utilizzati i diversi tipi di hashing:
- Hashing diretto: Memorizzazione di informazioni in una tabella hash per un piccolo set di elementi con chiavi uniche, come i codici dei dipendenti in una tabella.
- Hashing con catena: Memorizzazione di informazioni in una tabella hash per un set più grande di elementi con chiavi duplicate, come gli indirizzi e-mail in un database.
- Hashing perfetto: Memorizzazione di un set fisso di chiavi, come i vocaboli di un dizionario, in una tabella hash con una dimensione ottimale per evitare collisioni.
- Hashing di Bloom: Verifica la presenza di un elemento in un set, come gli indirizzi IP in un firewall, in modo efficiente in termini di memoria.
- Hashing di crittografia: Verifica l’integrità dei dati, come i file scaricati da Internet, e la sicurezza dei dati, come le password memorizzate nei sistemi di autenticazione.
È importante scegliere il tipo di hashing più adatto alle proprie esigenze per garantire le prestazioni, la sicurezza e l’efficienza.