Haszowanie (adresowanie rozpraszające, mieszające) Tadeusz Pankowski H. Garcia-Molina, J.D. Ullman, J. Widom, Implementacja systemów baz danych, WNT, Warszawa, Haszowanie W adresowaniu haszującym wyróżniamy następujące elementy: funkcja haszująca (hash function), h, której argumentem jest wartość x nazywana kluczem haszowanym (hash key); x jest wartością pewnego pola lub grupy pól w rekordach określonego typu; h(x) jest liczbą całkowitą z przedziału [, B ], gdzie B jest liczbą kubełków (ang. buckets), tj. pozycji w pewnej przestrzeni adresowej; przez kubełek rozumiemy zbiór rekordów, dla których funkcja haszująca przyjmuje tę samą wartość (funkcja ta dla różnych rekordów i dla różnych kluczy haszujących może zwracać tę samą wartość) Haszowanie, T. Pankowski Haszowanie, T. Pankowski Haszowanie pośrednie i bezpośrednie Haszowanie pośrednie Kubełek może być implementowany na wiele sposobów: wartość funkcji haszującej jest traktowana jako pozycja w pewnej tablicy haszowej, która zawiera wskaźniki na początek listy bloków rekordów przyporządkowanych do danego kubełka (hashowanie pośrednie); wartość funkcji haszującej wskazuje bezpośrednio pierwszy blok rekordów przyporządkowanych do danego kubełka (hashowanie bezpośrednie); x h(x) k B r,, r n r,, r n * Ogólny schemat haszowania pośredniego: tablica haszowa identyfikuje kubełki i zawiera wskaźniki na listy bloków rekordów o jednakowej wartości funkcji haszującej Haszowanie, T. Pankowski Haszowanie, T. Pankowski 4
x Haszowanie bezpośrednie h(x) B Funkcja haszująca wskazuje na pierwszy blok rekordów. Rekordy nadmiarowe umieszczane są w blokach przepełnień. Haszowanie jako metoda indeksowania Zauważmy, że jeśli w blokach pamiętane są nie całe rekordy (krotki), ale adresy rekordów (wskaźniki do rekordów pamiętanych w plikach), to haszowanie, podobnie jak na przykład indeksy o strukturze B-drzewa, może być traktowane jako metoda szybkiego dostępu do tych rekordów. Wówczas celowe jest współistnienie wiele ścieżek dostępu (adresowań haszujących), a których każda organizowana jest dla innych atrybutów (kluczy) wyszukiwania. Haszowanie, T. Pankowski 5 Haszowanie, T. Pankowski 6 Haszowanie operacja dołączania Haszowanie operacja usuwania INSERT: h(a) = h(b) = h(c) = h(d) = h(e) = d a c b e Pamięć haszowana. Blok mieści rekordy. Rekordy nadmiarowe umieszczane są w blokach nadmiarów (przepełnień). Delete: e f c a b c e f g d być może g do góry d Haszowanie, T. Pankowski 7 Haszowanie, T. Pankowski 8
Funkcja haszująca przykład klucz = x x x n n-bajtowy ciąg znaków B liczba kubełków h:= x + x +.. x n (suma kodów znaków) adres := h mod B, (liczba od do B-) Ta funkcja może być niedobra Patrz: Knuth Vol. przegląd funkcji haszujących. Dobra funkcja haszująca: równomiernie rozprasza wartości kluczy na wszystkie kubełki niski koszt obliczenia wartości Haszowanie, T. Pankowski 9 Haszowanie, T. Pankowski Rozmieszczanie rekordów w kubełkach Czy rekordy posortowane wg klucza? Tak, jeśli czas CPU jest parametrem krytycznym i operacje Insert/Delete niezbyt częste Reguła efektywności Współczynnik wykorzystania pamięci między 5% a 8% Wsp.wykorzystania = faktyczna liczba kluczy maksymalna liczba kluczy Jeśli < 5%, marnowanie pamięci Jeśli > 8%, częste przepełnienia zależy od jakości funkcji haszującej i od liczby kluczy na blok Haszowanie, T. Pankowski Haszowanie, T. Pankowski
Jak radzić sobie ze wzrostem liczby kluczy? Haszowanie dynamiczne Przepełnienia i ich reorganizacja Haszowanie dynamiczne Rozszerzalne (Extensible) Liniowe (Linear) Haszowanie, T. Pankowski 4 Haszowanie rozszerzalne Różnica względem statycznych tablic haszowych:. Istnieje poziom pośredni zawierający tablicę haszową kubełków, tj. wskaźników na bloki reprezentujące kubełki (pierwsze bloki tych kubełków).. Tablica haszowa może się zwiększać. Jej długość jest zawsze potęgą liczby. Przy zwiększaniu tablica podwaja swoją długość.. Nie muszą istnieć bloki danych dla każdego kubełka; niektóre kubełki mogą wskazywać na ten sam blok, jeśli blok ten może pomieścić rekordy należące teoretycznie do różnych kubełków. 4. Funkcja haszująca oblicza dla każdego klucza ciąg b bitów (np. b=). Jednak na danym kroku haszowania wykorzystywana jest mniejsza liczba bitów, tj. i bitów początkowych ciągu. Oznacza to, że tablica haszowa kubełków zawiera wówczas i pozycji. Haszowanie rozszerzalne Wykorzystanie pierwszych i spośród b bitów tworzonych przez funkcję haszującą h(k) b wybieramy i zwiększa się w czasie. Haszowanie, T. Pankowski 5 Haszowanie, T. Pankowski 6
Haszowanie rozszerzalne Dołączanie przy haszowaniu rozszerzalnym powstanie przepełnienia i = Adres bloku dla kluczy zaczynających się na Wskazuje ile bitów jest branych pod uwagę i =. Wymagane jest utworzenie dodatkowego kubełka.. Konieczne staje się powiększenie (podwojenie) wielkości tablicy haszowej.. Przyjmujemy i =. b=4, i= Tablica haszowa ma tylko dwie pozycje. Pierwsza wskazuje na kubełek rekordów, dla których pierwszy bit wartości funkcji haszującej h(x) jest, a druga dla których pierwszy bit jest równy. Z każdym kubełkiem związana jest liczba i wskazująca liczbę rozróżnialnych bitów Haszowanie, T. Pankowski 7 Insert Haszowanie, T. Pankowski 8 Dołączanie przy przy haszowaniu rozszerzalnym rozwiązanie problemu przepełnienia i = i= Insert Nowa tablica haszowa Zawartość dwóch kubełków ( i ) umieszczona jest w jednym bloku Haszowanie, T. Pankowski 9 Dołączanie przy przy haszowaniu rozszerzalnym tworzenie nowego bloku dla kubełka i = Insert: Dołączenie wymaga utworzenia nowego bloku dla kubełka i rehaszowania dotychczasowego bloku. Nie ma potrzeby zmiany tablicy haszowej.
Przykład c.d. i = i = Haszowanie rozszerzalne usuwanie Bez łączenia bloków Łączenie bloków i skracanie tablicy haszowej (Procedura odwrotna do insert) Insert: Haszowanie, T. Pankowski Przykład Deletion : Prześledzić odwrotne działanie względem Insert! + Haszowanie rozszerzalne podsumowanie Obsługuje pliki o wzrastających rozmiarach -przy małym marnowaniu pamięci - bez potrzeby pełnej reorganizacji - - Pośredni dostęp (Mała wada, gdy tablica haszowa w pamięci) Podwajający się rozmiar tablicy haszowej (Tabela haszowa może nie mieścić się w pamięci) Haszowanie, T. Pankowski Haszowanie, T. Pankowski 4
Haszowanie liniowe Inny schemat haszowania dynamicznego Dwie cechy: (a) Wykorzystuje i ostatnich bitów wartości funkcji haszującej (b) Rozmiar pliku wzrasta liniowo wzrost b i Haszowanie liniowe zasady. Liczba bloków n jest tak dobierana, by średnia liczba rekordów na blok wynosiła ok. 8% pojemności bloku.. Dopuszczalne są bloki przepełnień, jednak ich średnia liczba na blok jest dużo mniejsza od.. Liczba bitów do identyfikowania bloków wynosi log n, gdzie n jest liczbą bloków. Bity te są brane z prawej (niższej) strony ciągu bitów tworzonych przez funkcję haszującą. 4. Przypuśćmy, że rekord o kluczu K ma być umieszczony w bloku a a a i, tzn. ciąg a a a i ciągiem ostatnich i bitów wartości h(k). Niech m= a a a i będzie liczbą całkowitą (numerem bloku). Jeśli m<n, to blok m istnieje i umieszczamy w nim rekord. Jeśli n m < i-, to blok m nie istnieje. Wówczas rekord umieszczamy w bloku o numerze m- i-, tzn. o numerze odpowiadającym ciągowi a a i. Haszowanie, T. Pankowski 5 Haszowanie, T. Pankowski 6 Przykład: i = bit, n = bloki, r = rekordy Przykład: i = bit, n = bloki, r = rekordy (c.d.) m = (max zajęty blok) h(k) zwraca 4 bity n/r.6 wymaganie na współczynnik wypełnienia (naruszenie warunku wymusza zwiększenie n) Insert Przyjmujemy: n=, r=4, ¾=.75! i = log = -dołączamy nowy blok, - rozdzielamy blok na i - blok nie zmienia się, ma numer pozostaje w, gdyż jest to numer powstały przez zastąpienie zerem pierwszej cyfry w (!)?? Narusza to warunek: n/r.6 r=4 /4 =.5 i = bity, n = bloki, r = 4 rekordy
Przykład: i = bity, n = bloki, r = 4 rekordy Insert: Przykład: i = bity, n = bloki, r = 4 rekordy Insert: n=, r=5, n/r=.6, nie musimy tworzyć nowego bloku! dopuszczalny łańcuch przepełnień! Przykład: i = bity, n = bloki, r = 5 rekordów Przykład: i = bity, n = bloki, r = 6 rekordów Insert: brak bloku rekord kierujemy do umieszczamy go w bloku przepełnień? n=, r=6, n/r=.5 <.6, Tworzymy nowy blok Rozdzielamy rekordy z
Przykład: i = bity, n = 4 bloki, r = 6 rekordów Dalszy wzrost rozmiaru pliku i =... n=4, r=6, n/r=.66 m = (max blok) Haszowanie, T. Pankowski 4 Kiedy powiększać pulę bloków? Pamiętać współczynnik: m liczba bloków = Jeśli U > wart.progowej, wówczas powiększ m (i być może też i) r liczba rekordów = U + + - Haszowanie liniowe Podsumowanie Może obsługiwać duże pliki -z małą stratą pamięci -bez pełnej reorganizacji Nie ma pośredniego poziomu, jak w przypadku haszowania rozszerzanego Ciągle istnieją łańcuchy bloków przepełnień Haszowanie, T. Pankowski 5 Haszowanie, T. Pankowski 6