METODI DI ACCESSO (HASH) informativi/hash.pdf · metodi per la funzione Hash • Per evitare che il...

21
hash 1 METODI DI ACCESSO (HASH) hash 2 Nelle lezioni precedenti Avete visto: le caratteristiche delle principali unità di memoria permanente la struttura dei files il loro ordinamento In questa lezione Presenteremo: le caratteristiche principali dei metodi hash per l’accesso alle tuple (record)

Transcript of METODI DI ACCESSO (HASH) informativi/hash.pdf · metodi per la funzione Hash • Per evitare che il...

Page 1: METODI DI ACCESSO (HASH) informativi/hash.pdf · metodi per la funzione Hash • Per evitare che il numero così ottenuto sia maggiore di 7000, lo si normalizza moltiplicandolo per

hash 1

METODIDI

ACCESSO(HASH)

hash 2

Nelle lezioni precedenti• Avete visto:– le caratteristiche delle principali unità

di memoria permanente– la struttura dei files– il loro ordinamento

In questa lezione• Presenteremo:– le caratteristiche principali dei metodi

hash per l’accesso alle tuple (record)

Page 2: METODI DI ACCESSO (HASH) informativi/hash.pdf · metodi per la funzione Hash • Per evitare che il numero così ottenuto sia maggiore di 7000, lo si normalizza moltiplicandolo per

hash 3

organizzazioni hash• IDEA DI BASE : associare ad un

file di NB blocchi una funzione che trasformi un valore di chiave ki in un numero di blocco bi tra 1 ed NB– una tupla viene memorizzata nel

blocco bi– ad ogni blocco è associato un

indirizzo nel DASD– un blocco puo' contenere 1 o più

tuple

hash 4

organizzazioni hashLa regola con cui ad una chiave k viene associato unnumero di blocco b si chiama funzione hash oalgoritmo di hashing.

tupla : < chiave, informazione>

HASH (chiave) = b

b-1 b b+1

Page 3: METODI DI ACCESSO (HASH) informativi/hash.pdf · metodi per la funzione Hash • Per evitare che il numero così ottenuto sia maggiore di 7000, lo si normalizza moltiplicandolo per

hash 5

organizzazioni hashIl file è ben utilizzato se:• ci sono pochi spazi vuoti, cioè se il fattore di

"packing”(caricamento) è' elevato:Fp = m/M <1, dove:

M = numero massimo di record per blocco, m = numero medio di record per blocco

• l’occupazione effettiva dei blocchi è vicina alla media

Fp basso sta a significare che il file è vuoto,Fp vicino ad 1 da significare che molti blocchisono pieni. Con i blocchi pieni si creano problemi

di OVERFLOW

hash 6

organizzazioni hashQuando un blocco (es. bj) è pieno ed una nuova tupla deve essere inserita poiché FH (f. hash) gli ha assegnato quel blocco (bj) allora si deve creare una lista (catena) di overflow.

File overflow

bj bk bn

FH

bj bk

bj

bk

bk

tupla itupla e

tupla i tupla e

o 1 o 2

Page 4: METODI DI ACCESSO (HASH) informativi/hash.pdf · metodi per la funzione Hash • Per evitare che il numero così ottenuto sia maggiore di 7000, lo si normalizza moltiplicandolo per

hash 7

organizzazioni hashL'OVERFLOW avviene per due motivi:• ci sono più tuple con lo stesso valore di chiave

per cui FH le manda nello stesso blocco• FH non è perfetta ed assegna a due o più

valori di chiave diversi lo stesso blocco del file (collisione)

con lunghe liste di overflow si degrada l'efficienzaFH deve distribuire le tuple il più uniformementepossibile nei blocchi. Osserviamo che:• più piccolo è il blocco rispetto alle tuple più è

alto Fp ma più probabile è l'overflow,• più grande è il blocco rispetto alle tuple più è

basso Fp ma è meno probabile l'overflow.

hash 8

metodi per la funzione Hash1) MID-SQUARE:• La chiave (convertita in numero se

alfanumerica) è moltiplicata per se stessa ed i numeri centrali del quadrato vengono presi e normalizzati per rientrare nel "range" NB del numero di blocchi del file.

• ES: se un record ha una chiave di 6 cifre ed il file ha NB=7000 blocchi, il quadrato ha 12 cifre e si prendono le quattro dalla 5a alla 8a, se il numero è 172148, il quadrato è 029634933904 e le cifre centrali sono 3493.

Page 5: METODI DI ACCESSO (HASH) informativi/hash.pdf · metodi per la funzione Hash • Per evitare che il numero così ottenuto sia maggiore di 7000, lo si normalizza moltiplicandolo per

hash 9

metodi per la funzione Hash• Per evitare che il numero così ottenuto sia

maggiore di 7000, lo si normalizza moltiplicandolo per 7000/10000, cioè il numero del blocco che risulta è 0.7 x 3493 = 2445.

• I due numeri immediatamente precedenti e successivi danno:172146 ⇒ 3224 ⇒ 2397172147 ⇒ 3450 ⇒ 2415172149 ⇒ 3527 ⇒ 2469172150 ⇒ 3562 ⇒ 2493

• Due valori successivi danno lo stesso blocco !

hash 10

metodi per la funzione Hash2) DIVISIONE• La chiave K viene divisa per il numero primo

più vicino ad NB ed il resto viene preso come numero del blocco

Es. 172148 viene diviso per 6997 (numero primo più vicino < NB) ed il resto è 4220

172146 ⇒ 4218172147 ⇒ 4219172149 ⇒ 4221172150 ⇒ 4222

• Il metodo della divisione non è un "randomizzatore", ma assegna valori successivi di K a blocchi successivi.

Page 6: METODI DI ACCESSO (HASH) informativi/hash.pdf · metodi per la funzione Hash • Per evitare che il numero così ottenuto sia maggiore di 7000, lo si normalizza moltiplicandolo per

hash 11

metodi per la funzione Hash3) SHIFTING• Le cifre della chiave K vengono divise in due (o

più) gruppi, vengono spostate in modo da sovrapporsi per un numero di cifre pari al numero di cifre che rappresentano NB blocchi, i frammenti di K vengono sommati ed il risultato viene normalizzato.

8 cifre ⇒ 4 cifre per NB

Es: : 17207329 ⇒ 1720 | 7359 ⇒ 1720 +7359 =9079

hash 12

metodi per la funzione Hash4) FOLDING• I frammenti vengono "ripiegati" (fold) su se stessi e

poi sommati, le cifre in eccesso vengono eliminate• ES.: 17207329 ⇒ 17 | 207 | 329

SHIFTING e FOLDING vengono generalmente adoperatiper chiavi alfa- numeriche molto lunghe

8 cifre ⇒ 3 cifre207 +923 +717 =

1847 ⇒ 847

Page 7: METODI DI ACCESSO (HASH) informativi/hash.pdf · metodi per la funzione Hash • Per evitare che il numero così ottenuto sia maggiore di 7000, lo si normalizza moltiplicandolo per

hash 13

metodi per la funzione Hash• Esempio: sequenza di 22 registrazioni di cui si

evidenzia solo la chiave, da memorizzare in un archivio di 13 blocchi la cui capacità è 2.

• funzione hash: i caratteri della chiave vengono convertiti in numeri prendendo i primi 4 bit della codifica BCD, successivamente se la stringa numerica così ottenuta è più lunga di 5 la si spezza in gruppi di 5 a partire da sinistra e poi si sommano i gruppi, infine si divide il numero per 13 e si prende il resto della divisione.

hash 14

• DATI NUMERO RESTO (mod 13)• 1 LUISA 34921 4• 2 EDVIGE 54602 3• 3 ADELE 14535 2• 4 AGNESE 17557 8• 5 FRANCESCA 74384 12• 6 ROBERTA 96290 13• 7 NOEMI 56549 13 • 8 ELENA 53551 5• 9 LAURA 31491 6 • 10 BEATRICE 26074 10 • 11 DIANA 49151 12• 12 IRENE 99555 2 • 13 PAOLA 71631 2• 14 BERENICE 26890 7• 15 VANESSA 51573 3• 16 SARA 02191 8 • 17 CARLA 31931 10 • 18 OLGA 06371 2• 19 GIORGIA 79788 8• 20 LARA 03191 7• 21 CAROLA 31964 11• 22 GIOVANNA 80202 6

Page 8: METODI DI ACCESSO (HASH) informativi/hash.pdf · metodi per la funzione Hash • Per evitare che il numero così ottenuto sia maggiore di 7000, lo si normalizza moltiplicandolo per

hash 15

indirizzo ARCHIVIO puntatore• 1• 2 ADELE IRENE 14• 3 EDVIGE VANESSA• 4 LUISA• 5 ELENA• 6 LAURA GIOVANNA• 7 BERENICE LARA• 8 AGNESE SARA 15• 9 • 10 BEATRICE CARLA• 11 CAROLA• 12 FRANCESCA DIANA• 13 ROBERTA NOEMI• 14 PAOLA OLGA overflow record• 15 GIORGIA overflow record

Come si può vedere i blocchi 1 e 9 non vengono riempiti, mentre 2 ed 8 vanno inoverflow.

hash 16

COSA VUOL DIRE "METODO MIGLIORE"?• Il metodo migliore è quello che distribuisce il più

uniformemente possibile le tuple, evitando di riempire troppo alcuni blocchi lasciandone vuoti altri. In generale bisogna fare esperimenti e poi eventualmente cambiare funzione Hash e/o il numero di blocchi NB.

• Il metodo Mid-square e quello che più si avvicina ad un generatore di valori random. Il metodo della divisione è in generale il migliore perché "distribuisce" meglio le tuple.

• Per un FILE HASH si devono definire un numero NB di blocchi che costituiscono la " PRIME AREA " e NO per la " OVERFLOW AREA

Page 9: METODI DI ACCESSO (HASH) informativi/hash.pdf · metodi per la funzione Hash • Per evitare che il numero così ottenuto sia maggiore di 7000, lo si normalizza moltiplicandolo per

hash 17

overflow distribuito

FH

N blocchi overflow overflowN blocchi

hash 18

overflow distribuito• 1 blocco di overflow ogni N blocchi. Se non c’è

posto nel primo OB si carica la tupla nel successivo OB

• Questo metodo si attua quando il file system alloca al file molti cilindri di disco, allora per ogni cilindro di T tracce le prime T-1 contengono i blocchi del file e la T-esima contiene l’overflow . Ciò consente di cercare in overflow evitando il più possibile di spostare il pettine di lettura .

• Sinonimi blocco: bucket, paginatupla: record, n-pla

Page 10: METODI DI ACCESSO (HASH) informativi/hash.pdf · metodi per la funzione Hash • Per evitare che il numero così ottenuto sia maggiore di 7000, lo si normalizza moltiplicandolo per

hash 19

prestazioni

hash 20

prestazioni

Page 11: METODI DI ACCESSO (HASH) informativi/hash.pdf · metodi per la funzione Hash • Per evitare che il numero così ottenuto sia maggiore di 7000, lo si normalizza moltiplicandolo per

hash 21

prestazioni• Es.: 10000 tuple di 200 bytes con blocchi di

4096, capacità = 20usando le curve del grafico si ha che:

• caricamento del 100% overflow al 17%,NB= 10000/200= 500, NO = 85, tot.= 585Chash = 1 nel 83% dei casi ≥ 2 nel 17%

• caricamento del 70% overflow al 3%,NB= 10000/14=715, NO= 22, tot. = 737Chash = 1 nel 97% dei casi ≥ 2 nel 3%

hash 22

Metodo open addressing- Non ci sono blocchi di overflow.- I blocchi sono dimensionati con molta area vuota.- Se un blocco va in overflow il record viene messo

nel primo blocco successivo con area disponibile. (NB va in overflow in 1)

X Y Z K

x x

x x

y

yx

x x z

z y

k

4 record per blocco

Page 12: METODI DI ACCESSO (HASH) informativi/hash.pdf · metodi per la funzione Hash • Per evitare che il numero così ottenuto sia maggiore di 7000, lo si normalizza moltiplicandolo per

hash 23

open addressing

• Prime area consecutive spill: il record viene posto nel blocco successivo

• Prime area skip spill: il record viene posto in un blocco a distanza prefissata.

• Non ci sono puntatori.• La ricerca di un record parte dal blocco

indirizzato da FH e poi segue in modo sequenziale fintanto che viene trovata una posizione vuota, se il record fosse stato presente sarebbe infatti stato posto nella prima posizione vuota disponibile.

hash 24

open addressing• Questo metodo poiché si basa sulla ricerca

dei records fintanto che non si trova un "vuoto" non può rendere "vuoti" i recordseliminati.

• I records eliminati vengono marcati come "non attivi" poiché servono alla ricerca dei successivi. I records marcati possono però venire utilizzati per accogliere nuovi recordsattivi. In conclusione ci sono 3 tipi di records: ATTIVI, NON ATTIVI, VUOTI

• Le prestazioni degradano per fattori di caricamento >60%

Page 13: METODI DI ACCESSO (HASH) informativi/hash.pdf · metodi per la funzione Hash • Per evitare che il numero così ottenuto sia maggiore di 7000, lo si normalizza moltiplicandolo per

hash 25

Hash dinamicoLINEAR HASHING(1980)Scopi:• Contenimento dell'area di overflow • Crescita controllata del file• Riorganizzazione automatica

I metodi statici si fermano all’esaurimento dell’overflow , devono essere monitorati e ristrutturati in tempo aumentando NB e facendo il re-hash con un altro divisore o altra FH

hash 26

Linear Hashing, metodo:• ogni volta che un blocco (qualsiasi esso sia) va in

overflow–deposita il record in overflow–effettua un block-split (partizionamento di un

blocco).• non effettua il block-split per il blocco andato in

overflow, effettua automaticamente il block-split per il primo blocco (a partire dall’inizio del file) che non ha ancora subito un block-split! (Bj).

• acquisisce un nuovo blocco successivo all'ultimo nel file e ridistribuisce i records Bj (e del suo overflow) traBj ed il blocco appena acquisito.

Page 14: METODI DI ACCESSO (HASH) informativi/hash.pdf · metodi per la funzione Hash • Per evitare che il numero così ottenuto sia maggiore di 7000, lo si normalizza moltiplicandolo per

hash 27

Linear hashing• Non può fare direttamente il block-split del

blocco andato in overflow (come nel B-tree) poiché dovrebbe in tal caso fare il re-hash del file, in quanto inserire un blocco vuol dire cambiare la numerazione

• i records in overflow vengono recuperati tutte le volte che si realizza un block split , risultati sperimentali riportano un overflowpraticamente nullo per fattori di caricamento del 50% e dell'ordine del 5% per fattori di caricamento del 75%.

hash 28

Linear hashing• ALGORITMO• Chiave del record : key (convertita in

numero)• Hash-range iniziale : M, meglio se primo.• Numero blocchi iniziali: M0← M, M1← M• I blocchi numerati da 0 ad M0-1 .• Funzione Hash H[key]: address ← key

mod(M0)• Split pointer: SP : numero del blocco del

prossimo split

Page 15: METODI DI ACCESSO (HASH) informativi/hash.pdf · metodi per la funzione Hash • Per evitare che il numero così ottenuto sia maggiore di 7000, lo si normalizza moltiplicandolo per

hash 29

Begin {linear hashing}SP ← 0;Per ogni record : indirizzo ← H(key);if indirizzo >M1- 1 then indirizzo ← indirizzo - M0/2; {a}si inserisce il record; if record va in overflow allora

begin M1 ← M1 + 1; si acquisisce il nuovo blocco BM1-1;se M1>M0 allora SP ← 0, M0← 2 × M0;si effettua il re-hash dei record contenuti in

BSP e nell'overflow per BSP e si distribuiscono tra BSP e BM1-1 ;

SP ← SP+1end

end

hash 30

Linear hashing0 1 M0 - 1 M1 - 1

area di overflow

nuovo bloccoSP

ESEMPIO. M0=7 : resti a 77 → 0 , 14 → 0 , 28 → 0 , 21 → 0

0 1 6

Page 16: METODI DI ACCESSO (HASH) informativi/hash.pdf · metodi per la funzione Hash • Per evitare che il numero così ottenuto sia maggiore di 7000, lo si normalizza moltiplicandolo per

hash 31

Linear hashingSupponiamo che avvenga un overflow (in questo caso M1>M0), allora M0 ←14,si fa il re-hash dei record nel blocco 0 con resto a 14: 7 → 7, 14 → 0, 28 → 0, 21 → 7

0 1 6 7

nuovoil test {a} fa in modo che non si alterino gli altri indirizzi:13 → 13 13-7 → 615 → 1 26 → 12 12-7 → 59 → 9 9-7 → 2

Facendo lo split ed il re-hash i valori delle key vengonomodificati, quindi quando raddoppio di nuovo M, il test{a} va fatto solo sui nuovi record e non sui vecchi che sono stati già modificati.

hash 32

extendible hashing• L'extendible hashing è un metodo di hash

dinamico che usa una struttura dati ausiliaria, fu proposto da Fagin (IBM) nel 79.

• Nello schema extendible hashing l'archivio è strutturato in due livelli : un indice e l'area daticomposta da NB blocchi.

• Si suppone che l'indice possa in generale essere contenuto in memoria centrale e che quindi influisca in modo poco rilevante sul tempo di accesso all'archivio.

Page 17: METODI DI ACCESSO (HASH) informativi/hash.pdf · metodi per la funzione Hash • Per evitare che il numero così ottenuto sia maggiore di 7000, lo si normalizza moltiplicandolo per

hash 33

extendible hashing• L'indice è composto di coppie <valore, puntatore >:

• il valore è costituito da d bit, • il puntatore indirizza un blocco nell'area dati,• d è chiamato "profondità dell'indice", • l'indice è costituito da P = 2d puntatori che

puntano agli NB blocchi con P ≥ NB, • i puntatori non sono necessariamente tutti

distinti, ma se vi sono più puntatori allo stesso blocco essi sono 2q con q<d, in questo caso si dice che il blocco ha profondità locale d'=d-q.

• Poiché i valori sono sempre un numero p potenza di 2 non c’è bisogno di memorizzarli.

hash 34

000001010011100101110111

profondità: d= 3

INDICE d = 2

d = 3

d = 1

d = 3

....1

...110

...010

...00

AREA DATI

extendible hashing

Page 18: METODI DI ACCESSO (HASH) informativi/hash.pdf · metodi per la funzione Hash • Per evitare che il numero così ottenuto sia maggiore di 7000, lo si normalizza moltiplicandolo per

hash 35

extendible hashing• La ricerca di un record di chiave K avviene in

due passi:1 K viene trasformata dalla funzione Hash

nella chiave hash H, si estrae da H un suffisso S (prefisso) costituito dai primi d bit a partire da destra (sinistra), con S si cerca nell'indice e si trova il valore corrispondente;

2 si estrae il puntatore, si accede al blocco indirizzato e si cerca il record con chiave K.

hash 36

extendible hashingInserimento di un record di chiave K:• si cerca il blocco dove inserirlo come nel caso

della ricerca, se il blocco è saturo si possono avere due casi:

1 il blocco ha una profondità locale d'<d, allora si acquisisce un nuovo blocco, si aumenta d'di 1, si distribuiscono i vecchi ed il nuovo record tra il vecchio ed il nuovo blocco sulla base della differenziazione creata dal nuovo bit del suffisso(0/1) e si aggiornano i puntatori che puntavano al vecchio blocco.

Page 19: METODI DI ACCESSO (HASH) informativi/hash.pdf · metodi per la funzione Hash • Per evitare che il numero così ottenuto sia maggiore di 7000, lo si normalizza moltiplicandolo per

hash 37

000001010011100101110111

profondità':

INDICE d = 2

d = 3

d = 2

d = 3

...01

...110

...010

...00

...11d = 2

AREA DATI

d= 3

extendible hashing

hash 38

extendible hashing2 il blocco ha profondità d, allora si acquisisce

un nuovo blocco, si aumenta di 1 la profondità d dell'indice, si ridistribuiscono i vecchi ed il nuovo record sulla base della differenziazione creata dal nuovo bit del suffisso(0/1) e si ricostruisce l'indice raddoppiandolo (passa da 2 d-1 a 2d puntatori).

• In seguito a cancellazioni, in caso di svuotamento parziale o totale di blocchi, possono essere fusi due blocchi che si differenziano per l'ultimo bit del suffisso e l'indice può essere contratto.

Page 20: METODI DI ACCESSO (HASH) informativi/hash.pdf · metodi per la funzione Hash • Per evitare che il numero così ottenuto sia maggiore di 7000, lo si normalizza moltiplicandolo per

hash 39

00000001001000110100010101100111

profondità: d= 4

INDICE d = 2

d = 4

d = 2

d = 3

...01

...110

..0010

...00

...11d = 2

AREA DATI

10001001101010111100110111101111 d = 4

..1010

raddoppio

extendible hashing

hash 40

extendible hashing: costruzione

d = 0

vuoto

d = 0S1

S1S2

S1= 00011110S2= 11010001capacità del blocco= 2

passo 0

passo 1

passo 2

Page 21: METODI DI ACCESSO (HASH) informativi/hash.pdf · metodi per la funzione Hash • Per evitare che il numero così ottenuto sia maggiore di 7000, lo si normalizza moltiplicandolo per

hash 41

extendible hashing: costruzione

0d = 1

d = 1 1

S1S3

S2

01

S1S3

S2S4

d = 1

d = 1

S1= 00011110S2= 11010001S3= 00111100S4= 11000011

passo 3

passo 4

hash 42

extendible hashing: costruzioned = 2

0001

S3

S2S4

S1S5

d = 1

d = 2

S3

S2S6

S1S5

S4

d = 2

d = 2

d = 2

d = 2

S5= 11001010

S6= 11001001

passo 5

passo 6

1011

00011011