O functie hash este o procedura bine definita sau o functie matematica ce converteste o cantitate de date de dimensiuni varibile intr-o secventa de date de dimensiuni mici, de obicei de dimensiune fixa, care depinde de tipul algoritmului folosit si nu de cantitatea (lungimea) datelor de intrare.
O functie hash are (ar trebui sa aiba) urmatoarea proprietate: este imposibil de gasit, prin calcule, un alt bloc de date care sa aiba aceeasi valoare hash. Cu alte cuvinte, daca pentru un bloc se date dat calculam valoarea hash, este imposibila gasirea prin intermediul unui calcul a unui alt bloc a carui valoare hash sa fie aceeasi. Functiile hash sunt folosite in semnaturi digitale sau pentru verificarea integritatii datelor.
Valoarea hash are o lungime fixa indiferent de lungimea datelor pentru care a fist calculata. Valoarea hash a doua blocuri de date ar trebui sa fie identica daca cele doua blocuri de date sunt identice. Modificari minore in blocul de date duce la aparitia de modificari nepredictibile si importante in valoarea hash calculata.
O functie Hash nu este inversabila. Este imposibila reconstituirea satelor care au generau o anumita valoare hash.
.Net, in namespace-ul System.Security.Cryptography contine o serie de clase care implementeaza divesi algoritmi hash. HashAlgorithm este o clasa abstracta, folosita ca baza pentru diversi algoritmi de hash. In exemplul pe care vreau sa il prezint aici o sa folosesc 4 clase, derivate din HashAlgorithm care implementeaza 4 lgoritmi de criptare: SHA1, SHA256, SHA384, SHA512. Aceste clase sunt: SHA1Managed, SHA256Managed, SHA384Managed si SHA512Managed.
Pentru inceput am construit un enum, in care am introdus cei 4 algoritmi pe care il voi folosi, si cu ajutorul caruia userul va putea alege functia de hash dorita:

