home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* HASH.PAS *)
- (* Testprogramm zum Hashing *)
- (* (c) 1988 by Harald Großauer & TOOLBOX *)
- (* ------------------------------------------------------ *)
- PROGRAM Hash;
-
- USES Crt, Dos;
-
- CONST
- maxst = 5000; (* Maximaler Datenbereich *)
- calls = 4000; (* Anzahl der Sätze *)
- wiederholungen = 10;
-
- TYPE
- CARDINAL = WORD; (* um eine gewisse Ähnlichkeit mit *)
- (* Modula2 zu erreichen... *)
- stTyp = RECORD
- key : CARDINAL; (* Schlüssel *)
- element : INTEGER; (* eigentliche Daten *)
- col : BOOLEAN; (* Belegt-Flag *)
- END;
-
- VAR
- st: ARRAY[1..maxst] OF stTyp; (* Datenbereich *)
- keytab: ARRAY[1..calls] OF CARDINAL;
- (* Schlüsseltabelle *)
- sekukol,primkol:CARDINAL; (* Kollisionszähler *)
- i,j,k: CARDINAL;
- rndval,adress: CARDINAL;
- h,m,s,hs:WORD;
- maxkol: CARDINAL; (* maximal Kollision *)
-
- PROCEDURE Init;
- VAR i:CARDINAL;
- BEGIN
- FOR i := 1 TO maxst DO st[i].col := FALSE;
- END;
-
- PROCEDURE KollisionFkt(typ : BOOLEAN; val : CARDINAL;
- VAR adress : CARDINAL);
- VAR ok : BOOLEAN;
- i : CARDINAL;
- CONST faktor = 11;
- BEGIN
- primkol := primkol + 1; ok := FALSE; i := 1;
- WHILE NOT ok DO BEGIN
-
- (* ------------ Kollisions-Strategien ------------------- *)
- (* adress:= (adress + i * faktor) MOD maxst; *)
- (* adress:= (adress + i + faktor) MOD maxst; *)
- (* ------------------------------------------------------ *)
-
- adress:= (adress + i * i ) MOD maxst;
-
- IF typ THEN
- IF NOT st[adress].col THEN BEGIN (* Schreiben... *)
- st[adress].col := TRUE;
- ok := TRUE;
- END ELSE BEGIN
- i := i + 1; sekukol := sekukol + 1;
- END
- ELSE
- IF st[adress].key = val THEN ok := true (* Lesen... *)
- ELSE i := i + 1;
- END;
- (* ermittle maximal vorkommende Kollisionsanzahl *)
- IF i > maxkol THEN maxkol := i;
- END;
-
-
- PROCEDURE HashFkt(typ : BOOLEAN; val : CARDINAL;
- VAR adress : CARDINAL);
- BEGIN
- adress := val MOD maxst;
- IF typ THEN (* Schreiben... *)
- IF st[adress].col THEN KollisionFkt(typ,val,adress)
- (* kollidiert? *)
- ELSE st[adress].col := TRUE
- ELSE (* Lesevorgang *)
- IF st[adress].key<>val THEN
- KollisionFkt(typ,val,adress);
- END;
-
-
- BEGIN
- Randomize;
- Init;
- sekukol := 0; primkol := 0; maxkol := 0;
- FOR j := 1 TO calls DO BEGIN
- rndval:=Random(10000);
- HashFkt(TRUE,rndval,adress);
- (* Ermittlung der Adresse *)
- st[adress].key:=rndval; (* Abspeicherung Schlüssel *)
- keytab[j]:=rndval;
- END;
- Write('Sekundär Kollision ',sekukol:6); WriteLn;
- Write('Primär Kollision ',primkol:6); WriteLn;
- Write('Maximal Kollision ',maxkol :6); WriteLn;
- SetTime(0,0,0,0);
- FOR i:=1 TO wiederholungen DO
- FOR j:=1 TO calls DO BEGIN
- HashFkt(FALSE,keytab[j],adress);
- (* Ermittlung der Adresse *)
- END;
- GetTime(h,m,s,hs);
- Write('HASHING Zeit: ',m*60+s+hs/100:6:2); WriteLn;
- END.
- (* ------------------------------------------------------ *)
- (* Ende von HASH.PAS *)