Artykuł w Wikipedii na temat funkcji skrótu jest bardzo dobry, ale przedstawię tutaj swoje zdanie.
Co to jest skrót?
„Hash” jest naprawdę szerokim terminem o różnych formalnych znaczeniach w różnych kontekstach. Nie ma jednej idealnej odpowiedzi na twoje pytanie. Wyjaśnię ogólną podstawową koncepcję i wymienię niektóre z najczęstszych zastosowań tego terminu.
„Hash” to funkcja określana jako funkcja hash,
która przyjmuje jako obiekty wejściowe i wyprowadza ciąg lub liczbę. Obiekty wejściowe są zwykle elementami podstawowych typów danych, takich jak ciągi, liczby całkowite lub większe złożone z innych obiektów, takich jak struktury zdefiniowane przez użytkownika. Dane wyjściowe to zazwyczaj liczba lub ciąg znaków. Rzeczownik „skrót” często odnosi się do tego wyniku. Czasownik „skrót” często oznacza „zastosuj funkcję skrótu”. Główne właściwości, które powinna mieć funkcja skrótu to:h
- Powinno być łatwe do obliczenia i
- Wyniki powinny być stosunkowo małe.
Przykład:
Powiedzmy, że chcemy mieszać liczby w zakresie od 0 do 999,999,999 do liczby między 0 a 99. Jedną prostą funkcją skrótu może być .h(x)=xmod100
Wspólne dodatkowe właściwości:
W zależności od przypadku użycia możemy chcieć, aby funkcja skrótu spełniała dodatkowe właściwości. Oto kilka typowych dodatkowych właściwości:
Jednorodność : Często chcemy, aby skróty obiektów były wyraźne. Ponadto możemy chcieć, aby skróty były „rozłożone”. Jeśli chcę podzielić niektóre obiekty na 100 segmentów (więc wynikiem mojej funkcji skrótu jest liczba od 0 do 99), zazwyczaj mam nadzieję, że około 1/100 obiektów wyląduje w segmencie 0, około 1/100 wyląduje w wiadro 1 i tak dalej.
Kryptograficzna odporność na kolizje : czasami jest to brane jeszcze dalej, na przykład w kryptografii mogę chcieć funkcji skrótu takiej, że przeciwnikowi trudno jest znaleźć dwa różne dane wejściowe odwzorowane na to samo wyjście.
Kompresja : często chcę przesyłać dowolnie duże dane wejściowe do wyjścia o stałej wielkości lub stałej liczby segmentów.
Determinizm : Mogę chcieć funkcji skrótu, której dane wyjściowe nie zmieniają się między uruchomieniami, tzn. Dane wyjściowe funkcji skrótu na tym samym obiekcie zawsze pozostaną takie same. Może się to wydawać sprzeczne z powyższą jednolitością, ale jednym z rozwiązań jest jednokrotne wybranie funkcji skrótu, a nie zmiana jej między kolejnymi uruchomieniami.
Niektóre aplikacje
Jedną z powszechnych aplikacji są struktury danych, takie jak tablica skrótów, które są sposobem na implementację słowników. Tutaj przydzielasz trochę pamięci, powiedzmy 100 „segmentów”; następnie, gdy zostaniesz poproszony o zapisanie pary (klucz, wartość) w słowniku, umieścisz klucz w numerze 0-99 i zapiszesz parę w odpowiednim segmencie w pamięci. Następnie, gdy zostaniesz poproszony o wyszukanie klucza, umieścisz klucz w numerze 0-99 za pomocą tej samej funkcji skrótu i sprawdzisz wiadro, aby sprawdzić, czy ten klucz tam jest. Jeśli tak, zwracasz jego wartość.
Pamiętaj, że możesz także implementować słowniki na inne sposoby, na przykład za pomocą drzewa wyszukiwania binarnego (jeśli twoje obiekty są porównywalne).
Inną praktyczną aplikacją są sumy kontrolne, które są sposobem na sprawdzenie, czy dwa pliki są takie same (na przykład plik nie był uszkodzony od poprzedniej wersji). Ponieważ jest mało prawdopodobne, aby funkcje skrótu odwzorowały dwa dane wejściowe na to samo wyjście, obliczasz i przechowujesz skrót pierwszego pliku, zwykle reprezentowany jako ciąg. Ten skrót jest bardzo mały, może tylko kilkadziesiąt znaków ASCII. Następnie, gdy zdobędziesz drugi plik, zaszyfrujesz go i sprawdzisz, czy dane wyjściowe są takie same. Jeśli tak, prawie na pewno jest to dokładnie ten sam plik bajt po bajcie.
Inną aplikacją jest kryptografia, w której te skróty powinny być trudne do „odwrócenia” - to znaczy, biorąc pod uwagę dane wyjściowe i funkcję skrótu, obliczenie danych wejściowych, które doprowadziły do tego wyniku, powinno być trudne obliczeniowo. Jednym z zastosowań jest hasło: zamiast przechowywać samo hasło, przechowujesz kryptograficzny skrót hasła (być może z innymi składnikami). Następnie, gdy użytkownik wprowadzi hasło, obliczasz jego skrót i sprawdzasz, czy pasuje do poprawnego skrótu; jeśli tak, to mówisz, że hasło jest prawidłowe. (Teraz nawet ktoś, kto może sprawdzić i dowiedzieć się, jaki hash zapisany jest na serwerze, nie ma tak łatwego czasu udając, że jest użytkownikiem.) Ta aplikacja może być przypadkiem, gdy dane wyjściowe są tak samo długie lub dłuższe niż dane wejściowe, ponieważ dane wejściowe są tak krótkie.