ΕΝΟΤΗΤΑ 8 KATAKEΡΜΑΤΙΣΜΟΣ (HASHING)
Κατακερµατισµός Στόχος Έχουµε ένα σύνολο από κλειδιά {Κ 0,, Κ n-1 } και θέλουµε να υλοποιήσουµε Insert() και LookUp() (ίσως και Delete()) απλά και γρήγορα στην πράξη. Ιδέα Χρησιµοποιούµε έναν πίνακα κατακερµατισµού (hash table) πίνακας T[0..m-1] µε m > n (δηλ., µέγεθος µεγαλύτερο από το πλήθος των κλειδιών που θα χειριστούµε) µια συνάρτηση κατακερµατισµού (hash function) h: K {0,, m-1}, όπου Κ είναι ο χώρος των κλειδιών. Για κάθε j, το κλειδί K j αποθηκεύεται στη θέση Τ[h(K j )]. Αν η h µπορεί να υπολογιστεί γρήγορα, σε πόσο χρόνο µπορούµε να προσπελάσουµε το κλειδί? Ποιο πρόβληµα µπορεί να δηµιουργηθεί? 2
Συγκρούσεις (collisions) Σύγκρουση συµβαίνει όταν για δύο κλειδιά K i, K j που είναι διαφορετικά µεταξύ τους ισχύει ότι h(k i ) = h(k j ). Θα πρέπει να οριστεί ένας τρόπος διαχείρισης συγκρούσεων ώστε να επιλυθεί η σύγκρουση και τα κλειδιά να µπορούν να βρεθούν (µε LookUp()) σε λογικό χρόνο. Χρησιµοποιούνται 2 κύριοι τρόποι: τοποθέτηση στην ίδια θέση (π.χ., σε αλυσίδα) τοποθέτηση σε άλλη θέση Καλές Συναρτήσεις Κατακερµατισµού Κάνουν καλή διασπορά των κλειδιών στον πίνακα: Αν ένα κλειδί Κ επιλέγεται τυχαία από τον χώρο κλειδιών, η πιθανότητα να ισχύει h(k) = j, θα πρέπει να είναι 1/m, ίδια για όλα τα j (δηλαδή για όλες τις θέσεις του πίνακα). Παράδειγµα h(k) = k mod m Το m δεν πρέπει να είναι δύναµη του 2. Η hash function modulo επιτυγχάνει καλή διασπορά µόνο αν ο m είναι πρώτος αριθµός. 3
Κατακερµατισµός Προσπέλαση 1 πρόσβαση σε κάποιο µέρος της δοµής Παράδειγµα 1η προσπέλαση για την πρόσβαση στη θέση T[i] 2η προσπέλαση για την πρόσβαση στη θέση T[j], κλπ. n: πλήθος αποθηκευµένων κλειδιών m: µέγεθος πίνακα παράγων φόρτωσης (load factor) α = n/m S(α): αναµενόµενο πλήθος προσπελάσεων για την εύρεση κλειδιού που υπάρχει στην δοµή. U(α): αναµενόµενο πλήθος προσπελάσεων για κλειδί που δεν υπάρχει στην δοµή. 4
Μέθοδοι ιαχείρισης Συγκρούσεων Μέθοδος αλυσίδας T[j]: δείκτης σε µια αλυσίδα η οποία περιέχει όλα τα στοιχεία µε κλειδί Κ τέτοιο ώστε h(k) = j. 5
Μέθοδος Αλυσίδας 6
Μέθοδος Αλυσίδας Για την εύρεση κλειδιού, θα χρειαστούµε 1η προσπέλαση για την πρόσβαση στον πίνακα (προκειµένου να βρεθεί η θέση του πρώτου στοιχείου της αλυσίδας), 2η προσπέλαση στο 1 ο στοιχείο της αλυσίδας, κλπ. Αν όλες οι αλυσίδες είναι µη-άδειες, τότε το αναµενόµενο µήκος αλυσίδας θα είναι α = n/m U(α) = 1 + α = 1 + n/m 7
Ποιος είναι ο µέσος αριθµός προσπελάσεων για επιτυχηµένη αναζήτηση, αν Το µέγεθος της αλυσίδας είναι 1? Το µέγεθος της αλυσίδας είναι 2? Το µέγεθος της αλυσίδας είναι κ? S(α) = 1 + (1+α)/2 = 3/2 +α/2. Μια επιτυχηµένη LookUp ποτέ δεν εξετάζει άδειες αλυσίδες. Ωστόσο, το µήκος της αλυσίδας µπορεί να είναι λίγο µεγαλύτερο από α: S(α) 2 + α/2 Χειρότερη περίπτωση? Ποια είναι η κατάλληλη επιλογή για το m? Πόσο εύκολα µπορούµε να υλοποιήσουµε διαγραφή? 8
Μέθοδος Μικτών Αλυσίδων Ιδέα: Ολόκληρη η αλυσίδα αποθηκεύεται µέσα στον πίνακα. 9
Μέθοδος Ανοικτής ιεύθυνσης Τα κλειδιά αποθηκεύονται στον πίνακα κατακερµατισµού, αλλά δεν χρησιµοποιούνται δείκτες (δεν σχηµατίζονται αλυσίδες). Για κάθε κλειδί ελέγχεται µια ακολουθία από θέσεις (ακολουθία αναζήτησης/εξέτασης, probe sequence). Η ακολουθία καθορίζεται βάσει κάποιου κανόνα και µπορεί να εξαρτάται και από το ίδιο το κλειδί. Η(K, p): η p-οστή θέση που ελέγχεται για το κλειδί K, όπου p = 0, 1, LookUp: Ψάξε τις διαδοχικές θέσεις στην ακολουθία αναζήτησης, µέχρι είτε να βρεθεί το κλειδί, ή να βρεθεί µια κενή θέση στον πίνακα. Στη δεύτερη περίπτωση, το κλειδί δεν υπάρχει στον πίνακα. Insert: Έλεγξε τις διαδοχικές θέσεις στην ακολουθία αναζήτησης, µέχρι είτε να βρεθεί το κλειδί, ή να βρεθεί µια κενή θέση στον πίνακα στην οποία και εισάγεται το νέο κλειδί (µπορεί να απαιτείται ανακατανοµή των κλειδιών στον πίνακα, προκειµένου να µειωθεί ο χρόνος αναζήτησης). 10
Μέθοδοι Καθορισµού Ακολουθιών Αναζήτησης Γραµµική Αναζήτηση Προσπέλαση 0: Η(Κ,0) = h(k) Προσπέλαση p 1: H(K,p) = (H(K,p-1)+1) mod m (δηλ., η επόµενη θέση στον πίνακα) Τι γίνεται αν ο πίνακας είναι γεµάτος? Πώς µπορούµε να συµπεράνουµε κάτι τέτοιο? 0 11
Γραµµική Αναζήτηση Η απόδοση της µεθόδου είναι ικανοποιητική όταν ο πίνακας δεν είναι πολύ γεµάτος. Σηµαντικότερο Πρόβληµα Φαινόµενο Συγκέντρωσης (primary clustering) ηµιουργούνται τµήµατα (cluster) στον πίνακα µε συνεχόµενες κατειληµµένες θέσεις Αυτό αποτελεί προορισµό για περαιτέρω συγκρούσεις, ενώ νέες τέτοιες συγκρούσεις οδηγούν στην αύξηση του µεγέθους του τµήµατος. Πλήθος προσπελάσεων για µη επιτυχηµένη αναζήτηση αν η συνάρτηση κατακερµατισµού επιστρέφει µια κενή θέση του πίνακα? αν η συνάρτηση κατακερµατισµού επιστρέφει µια κατειληµµένη θέση του πίνακα? Προσπάθεια βελτίωσης: Πρόσθεσε µια σταθερά c > 1 (αντί για +1), για να βρεις την επόµενη θέση στην ακολουθία. Τι αποτέλεσµα θα έχει αυτή η προσπάθεια? Βοηθάει? 12
Βελτιώνοντας την Γραµµική Αναζήτηση Τετραγωνική αναζήτηση Προσπέλαση 0: Η(Κ,0) = h(k); Προσπέλαση p 1: H(K,p) = (h(k) + c1 * p 2 + c2 * p) mod m. Εµφανίζεται και εδώ πρόβληµα συγκέντρωσης (δευτερεύουσα συγκέντρωση, secondary clustering) καθώς όλα τα κλειδιά που έχουν ίδια τιµή h(k) ελέγχουν για κενές τις ίδιες θέσεις. ιπλός κατακερµατισµός Προσπέλαση 0: H(Κ,0) = h(k); Προσπέλαση p 1: H(Κ, p) = (H(K, p-1) + h 2 (K)) mod m = (h(k) + p * h 2 (K)) mod m h 2 (K): ευτερεύουσα συνάρτηση κατακερµατισµού 13
Βελτιώνοντας την Γραµµική Αναζήτηση Παράδειγµα ιπλού Κατακερµατισµού Βασική συνάρτηση κατακερµατισµού h(k): η ηµέρα θανάτου ευτερεύουσα συνάρτηση κατακερµατισµού h 2 (K): ο µήνας θανάτου (Ιανουάριος = 1, Φεβρουάριος = 2, κλπ.) 0 m = 31 Tι συµβαίνει κατά την εισαγωγή του τελευταίου ονόµατος, W. Hooper (October 14, 1790)? 14
ιπλός Κατακερµατισµός Η γραµµική αναζήτηση ισοδυναµεί µε διπλό κατακερµατισµό, αν h 2 (K) = 1, κλειδί K. Η ακολουθία αναζήτησης πρέπει (τελικά) να µην περιορίζεται σε λίγες µόνον θέσεις του πίνακα. Έτσι, πρέπει: κλειδί K, h 2 (K) 0 h 2 (K) και m δεν πρέπει να έχουν κοινούς διαιρέτες Γιατί? Έστω d διαιρεί το h 2 (K) και το m. Για p = m / d: [(m/d)*h 2 (K)] mod m = [m*(h 2 (K)/d)] mod m = 0, δηλ., η θέση για p = m/d στην ακολουθία θα είναι η ίδια µε την 1η (p = 0). Επιλέγουµε τον m να είναι πρώτος αριθµός. 15
Απόδοση Μεθόδου ιπλού Κατακερµατισµού Έστω ότι κάθε θέση που εξετάζεται στον πίνακα κατακερµατισµού είναι ανεξάρτητη από τις υπόλοιπες θέσεις του πίνακα. Είναι αυτή η υπόθεση σωστή? Όχι, αφού: 1. ιαδοχικές θέσεις µπορεί να εξαρτώνται µε κάποιο τρόπο. 2. εν εξετάζεται η ίδια θέση 2 φορές. Θεωρώντας ότι η υπόθεση είναι σωστή, a. η πιθανότητα να επιλεγεί µια κατειληµµένη θέση είναι ίση µε τον παράγοντα φόρτωσης, b. οπότε κατά την εισαγωγή n κλειδιών σε πίνακα κατακερµατισµού µεγέθους m: η πιθανότητα σύγκρουσης σε κάθε βήµα είναι α i = i/m, i n, µετά την εισαγωγή i κλειδιών. 16
Απόδοση Μεθόδου ιπλού Κατακερµατισµού Αναµενόµενο πλήθος προσπελάσεων σε µη επιτυχηµένη αναζήτηση, αν n-1 κλειδιά έχουν ήδη εισαχθεί: U n -1 = 1*(1 a n-1 ) + 2*a n-1 *(1-a n-1 )+3*a n-1 2 *(1-a n-1 ) + = 1 + a n-1 + a n-1 2 + = 1/(1 a n-1 ) Αναµενόµενο πλήθος προσπελάσεων σε επιτυχηµένη αναζήτηση = Αναµενόµενο πλήθος προσπελάσεων για την εισαγωγή κάθε ενός από τα n κλειδιά. Αλλά, αναµενόµενο πλήθος προσπελάσεων για την εισαγωγή του i-οστού κλειδιού = αναµενόµενο πλήθος προσπελάσεων σε µη επιτυχηµένη αναζήτηση. Εποµένως: n S n = (1/n) i = 1Ui 1 n = (1/n) i= 11/(1 a i 1) n = (m/n) i= 11/( m i+ 1) = (m/n) (H m H m-n ), όπου H i = 1 + ½ + + 1/i ln i S n (m/n) (ln m ln (m-n)) = (m/n) ln(m/m-n) = (1/a n ) ln (1/(1-a n )). 17
Ταξινοµηµένος Κατακερµατισµός (Ordered Hashing) Αν τα κλειδιά ήταν αλφαβητικά ταξινοµηµένα θα είχαµε µείωση του χρόνου για αποτυχηµένες αναζητήσεις: Αν ένα µεγαλύτερο κλειδί από το ζητούµενο Κ προσπελαστεί τερµατίζει η αναζήτηση. Μέθοδος µε αλυσίδες ιατηρούµε τα κλειδιά στις αλυσίδες ταξινοµηµένα αλφαβητικά. Μέθοδος Ανοικτής ιεύθυνσης Τα κλειδιά πρέπει να εισαχθούν έτσι ώστε: Τα κλειδιά που προηγούνται στην ακολουθία αναζήτησης από το Κ, θα πρέπει να είναι µικρότερα από το Κ. Ιδέα Αν στην ακολουθία αναζήτησης για το κλειδί Κ δούµε κλειδί Κ > Κ, τότε αντικαθιστούµε το Κ µε το Κ και συνεχίζουµε µε την εισαγωγή του Κ βάσει της ακολουθίας αναζήτησης του Κ. 18
Ταξινοµηµένος Κατακερµατισµός procedure OrderedHashInsert(key K, info I, hash_ptr P) if (P->size == m) then error; /* πλήρης */ T = P->Table; pos = h(k); while (T[pos]!= NULL) do if (T[pos]->Key > K) then swap(k, T[pos]->Key); swap(i, T[pos]->Info); else if (K == T[pos]->Key) then T[pos]->Info = I; return; pos = (pos + h 2 (K)) mod m; /* ιπλός */ T[pos] = new_struct(hash_node); T[pos]->Key = K; T[pos]->Info = I; P->size++; function OrderedHashingLookUp(key K, hash_ptr P): hash_ptr T = P->Table; pos = h(k); while (T[pos]!= NULL && T[pos]->Key < K) do pos = (pos + h 2 (K)) mod m; if (T[pos]!= NULL && T[pos]->Key == K) return T[pos]; else return NULL; 19
Ταξινοµηµένος Κατακερµατισµός Η τελική µορφή του πίνακα κατακερµατισµού, µετά την εισαγωγή σε αυτόν (βάσει της µεθόδου του ταξινοµηµένου κατακερµατισµού) ενός συνόλου από κλειδιά, θα είναι η ίδια ανεξάρτητα από τη σειρά εισαγωγής των κλειδιών στον πίνακα. Υπόθεση Η πιθανότητα να επιλεγεί ένα συγκεκριµένο κλειδί από τον χώρο κλειδιών είναι η ίδια για όλα τα κλειδιά του χώρου. Τότε: Ο αναµενόµενος χρόνος S n για επιτυχηµένη αναζήτηση δεν αλλάζει. Ο αναµενόµενος χρόνος Un για µη επιτυχηµένη αναζήτηση γίνεται περίπου ίδιος µε S n. Άρα: S n U n (1/a n ) ln(1/(1 a n )). 20
Ταξινοµηµένος Κατακερµατισµός ιαγραφές Μέθοδος µε αλυσίδες Γίνεται εύκολα. Πως? Μέθοδος Ανοικτής ιεύθυνσης Ένα κλειδί δεν µπορεί να διαγραφεί αφήνοντας απλά τη θέση που κατείχε άδεια. Γιατί? Παράδειγµα Έστω ότι χρησιµοποιούµε τη µέθοδο γραµµικής αναζήτησης. Έστω ότι 2 κλειδιά µε την ίδια βασική/πρωταρχική τιµή κατακερµατισµού εισάγονται στις θέσεις j και j+1 ενός πίνακα κατακερµατισµού και στη συνέχεια αυτό στη θέση j διαγράφεται. Το άλλο θα µείνει στη θέση j+1, αλλά η LookUp() θα σταµατήσει όταν βρει τη θέση j κενή. Λάθος! Ιδέα Για κάθε θέση του πίνακα υπάρχει ένα bit, που ονοµάζεται Deleted και µπορεί να είναι είτε 0 ή 1. Αρχικά όλα αυτά τα bits είναι 0. Αν διαγράψουµε κάτι από µια θέση του πίνακα, θέτουµε το bit της θέσης αυτής σε 1. H LookUp() δεν τερµατίζει σε άδειες θέσεις για τις οποίες το Deleted bit είναι 1. 21
Επεκτάσιµος Κατακερµατισµός (Extendible Hashing) Είναι µέθοδος που επιτρέπει την επαύξηση ή τη συρρίκνωση ενός πίνακα κατακερµατισµού, διατηρώντας παράλληλα τους χρόνους πρόσβασης στη δοµή χαµηλούς. Χρήσιµο για την αποθήκευση δεδοµένων στη δευτερεύουσα µνήµη. Μπορεί να χρησιµοποιηθεί εναλλακτικά αντί ενός Β-δένδρου. οµή εδοµένων 2 επιπέδων: o ένας κατάλογος (directory) που αποτελεί τη δοµή υψηλού επιπέδου και o ένα σύνολο από σελίδες φύλλα (leaf pages) στις οποίες αποθηκεύονται δεδοµένα. Ο κατάλογος είναι ένας πίνακας από δείκτες στις σελίδες. Οι σελίδες φύλλα είναι σταθερού µεγέθους, π.χ., b bytes η κάθε µια. 22
Επεκτάσιµος Κατακερµατισµός Η συνάρτηση κατακερµατισµού απεικονίζει κλειδιά σε bit strings µήκους L. L bits: 2 L τιµές κατακερµατισµού h d (K): τα πρώτα d bits του h(k), d <= L 23
Επεκτάσιµος Κατακερµατισµός Μια σελίδα περιέχει όλα εκείνα τα κλειδιά των οποίων η τιµή κατακερµατισµού έχει ένα συγκεκριµένο πρόθεµα από bits. Το µήκος αυτού του προθέµατος ονοµάζεται βάθος (depth) της σελίδας. Το µέγιστο βάθος κάθε σελίδας ονοµάζεται βάθος του πίνακα κατακερµατισµού. Ο κατάλογος είναι ένας πίνακας T µε 2 D δείκτες σε σελίδες, όπου D το βάθος του πίνακα κατακερµατισµού. Εύρεση σελίδας που περιέχει το κλειδί Κ Υπολογίζουµε το h D (K); Ακολουθούµε τον δείκτη T[h D (K)]; Αν για µια σελίδα ισχύει ότι d < D, τότε 2 D-d δείκτες σε συνεχόµενες θέσεις του πίνακα T θα δείχνουν στη σελίδα αυτή. 24
Επεκτάσιµος Κατακερµατισµός Εισαγωγές Μια σελίδα χωράει µόνο b δεδοµένα. Αν συµβεί υπερχείλιση µιας σελίδας µε βάθος d, η σελίδα χωρίζεται σε δύο σελίδες: δηµιουργία µιας νέας σελίδας, που ονοµάζεται φιλική σελίδα (buddy page) και αύξηση του βάθους των σελίδων σε d+1. Τι αλλαγές προκαλεί η δηµιουργία της νέας σελίδας στον κατάλογο? Περιπτώσεις 1. d < D Αλλαγή απλά µερικών δεικτών στον κατάλογο, ώστε αυτοί να δείχνουν στη νέα σελίδα. 2. d = D ιπλασιασµός του µεγέθους του καταλόγου και κατάλληλη αρχικοποίηση των δεικτών. 25
Επεκτάσιµος Κατακερµατισµός Παράδειγµα Εισαγωγής (Υποθέτουµε ότι b = 2) (α) Εισαγωγή κλειδιού µε τιµή κατακερµατισµού 11101. (β) Εισαγωγή κλειδιού µε τιµή κατακερµατισµού 01011. 26
Επεκτάσιµος Κατακερµατισµός ιαγραφές Αν η διαγραφή κάποιων κλειδιών από µια σελίδα 2i, για κάποιο i, έχει ως αποτέλεσµα αυτή µαζί µε την (2i+1) να έχει συνολικά b κλειδιά, θα µπορούσε να γίνει συνένωση των 2 σελίδων σε 1. Γενικά αυτή η λειτουργία είναι ακριβή και δεν είναι συνετό να γίνεται συχνά. Αποδοτικότητα Η µέθοδος: είναι αποδοτική σε χρόνο προσπέλασης, αφού απαιτείται µόνο µια πρόσβαση στην κύρια µνήµη και µια στη δευτερεύουσα για να επιτευχθεί η προσπέλαση του ζητούµενου κλειδιού (και δεδοµένου). δεν είναι αρκετά αποδοτική σε µνήµη, αφού πολλές από τις σελίδες µπορεί να είναι σχεδόν άδειες και αφού ο κατάλογος συνήθως περιέχει παραπάνω από έναν δείκτες που δείχνουν στην ίδια σελίδα. 27
Συναρτήσεις Κατακερµατισµού Οι µέθοδοι κατακερµατισµού που συζητήθηκαν έχουν πολύ καλή «µέση» απόδοση µόνο αν οι τιµές κατακερµατισµού των κλειδιών είναι οµοιόµορφα κατανεµηµένες (για το µέγεθος του πίνακα κατακερµατισµού). Στη χειρότερη περίπτωση τα πράγµατα µπορούν να είναι πολύ άσχηµα (γραµµική πολυπλοκότητα). Ενδέχεται, η συνάρτηση κατακερµατισµού να µην επιτυγχάνει καλή κατανοµή των κλειδιών γενικά ή για συγκεκριµένα σύνολα κλειδιών. Κατακερµατισµός µε ιαίρεση h(k) = K mod m m: µέγεθος πίνακα κατακερµατισµού p Αν Κ αλφαριθµητικό, υπολογίζουµε το όπου o p: µήκος του αλφαριθµητικού 1 i= 0 cir i, o c i : κωδικός (ASCII) του i-οστού χαρακτήρα του Κ o r: το πλήθος διαφορετικών χαρακτήρων στον κώδικα (συνήθως 128 ή 256) 28
Κατακερµατισµός µε ιαίρεση Προσοχή Τα κλειδιά µπορεί να µην είναι τυχαία Π.χ. Αν το m είναι r ή r 2, το αποτέλεσµα της διαίρεσης είναι ο κωδικός του ενός ή των δύο τελευταίων χαρακτήρων. Από τα γράµµατα του αλφάβητου είναι πολύ λίγα αυτά που συνήθως συναντούνται ως τελευταίοι χαρακτήρες λέξεων. Αν τα m και r είναι άρτια, η τιµή h(k) θα είναι άρτια ή περιττή ανάλογα µε το αν ο τελευταίος χαρακτήρας στο αλφαριθµητικό έχει περιττό ή άρτιο κωδικό. Καλή Συνάρτηση Κατακερµατισµού Αποφυγή συστηµατικών συγκρούσεων ακόµη και σε περιπτώσεις που τα κλειδιά επιλέγονται µε ένα συστηµατικά µη τυχαίο τρόπο. 29
Κατακερµατισµός µε ιαίρεση Λύση m να είναι πρώτος. Επίσης, είναι καλύτερο το m να µην διαιρεί τους r k +a, r k -1 για µικρές σταθερές k και a. Ενδεικτικά, έστω m = r-1 και έστω ότι r-1 είναι πρώτος: p 1 i= 0 ir c i p mod (r-1) = 1 i= 0 ( p = ( cir I mod (r-1)) mod (r-1) 1 i= 0 c i )mod (r-1) Μπορεί να αποδειχθεί επαγωγικά ότι για κάθε i, r i i = 1 + (r-1) 1 j= 0 r j. Άρα r i i mod (r-1) = (1 + (r-1) 1 j= 0 r j ) mod (r-1) = 1. ηλαδή, αν m = r-1, όλες οι µεταθέσεις του ίδιου συνόλου χαρακτήρων (π.χ., ABC, BCA, CBA, κλπ.) έχουν την ίδια τιµή κατακερµατισµού. 30
Συναρτήσεις Κατακερµατισµού Τέλειος Κατακερµατισµός Στατικών εδοµένων Αν γνωρίζαµε εξ αρχής τα κλειδιά που θέλουµε να αποθηκευτούν, ίσως να µπορούσαµε να σχεδιάσουµε µια συνάρτηση κατακερµατισµού που να αποφεύγει εντελώς τις συγκρούσεις. Έχουν αναπτυχθεί διάφορες τεχνικές για την εύρεση τέλειων συναρτήσεων κατακερµατισµού για δεδοµένα σύνολα κλειδιών. Η µέθοδος έχει περιορισµένη εφαρµογή, αφού συνήθως το σύνολο των κλειδιών δεν είναι γνωστό και τα δεδοµένα αλλάζουν δυναµικά. 31
Συναρτήσεις Κατακερµατισµού Ιδέα Η συνάρτηση κατακερµατισµού επιλέγεται τυχαία από ένα σύνολο συναρτήσεων κατακερµατισµού (κατά την εκτέλεση). Θετικά Η πιθανότητα επιλογής µιας «κακής» συνάρτησης κατακερµατισµού είναι µικρή. Σε επόµενη εκτέλεση του προγράµµατος, η πιθανότητα τα πράγµατα να πάνε και πάλι άσχηµα είναι µικρή. Ακόµη και αν τα κλειδιά που παρέχονται στο σύστηµα είναι πολύ προσεκτικά επιλεγµένα από έναν αντίπαλο (ώστε να αποτελούν άσχηµη είσοδο), η µέθοδος αυτή δουλεύει αποδοτικά. Αρνητικό Όχι επανάληψη προηγούµενων αποτελεσµάτων, σε περίπτωση που το θέλουµε (π.χ., αναπαραγωγή κάποιας κατάστασης σφάλµατος). 32
Καθολικές Κλάσεις Συναρτήσεων Κατακερµατισµού Κ: χώρος κλειδιών m: µέγεθος πίνακα κατακερµατισµού H: σύνολο συναρτήσεων από το Κ στο {0,...,m-1} Ορισµός Η κλάση συναρτήσεων Η λέγεται καθολική αν για κάθε ζεύγος κλειδιών x,y, όπου x y, ισχύει ότι: {h H: h(x) = h(y)} / H 1/m. ηλαδή, για κάθε ζεύγος διαφορετικών κλειδιών, µόνο ένα ποσοστό 1/m (το πολύ) των συναρτήσεων της κλάσης µπορεί να οδηγεί σε σύγκρουση κατά την αποθήκευση του ζεύγους. Εάν διαλέξουµε µια συνάρτηση από την κλάση τυχαία, η πιθανότητα ένα ζεύγος κλειδιών να οδηγήσει σε σύγκρουση είναι 1/m. 33
Καθολικές Κλάσεις Συναρτήσεων Κατακερµατισµού Θεώρηµα Έστω ότι Κ = k είναι πρώτος αριθµός, και έστω ότι το K περιέχει (ως κλειδιά) τους ακεραίους 0,..., k-1. Για κάθε αριθµό a {1,, k-1} και b {0,, k-1} έστω: Τότε, η h a,b (x) = ((ax+b) mod k) mod m H = {h a,b : 1 a < k και 0 b < k } είναι καθολική κλάση συναρτήσεων. Παρατηρήσεις Το µέγεθος m του πίνακα µπορεί να είναι οποιοσδήποτε ακέραιος και όχι απαραίτητα πρώτος, ούτε καν περιττός. Το m µπορεί να είναι ακόµη και δύναµη του 2. Η µέθοδος µπορεί να χρησιµοποιηθεί σε συνδυασµό µε τη µέθοδο του επεκτάσιµου κατακερµατισµού. 34