Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program Lab3;
- {$APPTYPE CONSOLE}
- {$R *.res}
- uses
- System.SysUtils;
- type
- SetCh = Set of ansiChar;
- SetsAndHash = record
- x: SetCh;
- h:integer;
- flg:boolean;
- end;
- tab = array of SetsAndHash;
- Hash = function (var x:SetCh):integer;
- var
- a:tab;
- f:textfile;
- n:integer;
- Equallity, Collision:integer;
- procedure MakeSet (var f:textfile; n:integer);
- var
- i, j, k:integer;
- begin
- randomize;
- k:=2 + random(3);
- for i := 1 to k do
- write (f, chr(97 + random (25)));
- for j := 2 to n do
- begin
- writeln (f);
- randomize;
- k:=3 + random(5);
- for i := 1 to k do
- write (f, chr(97 + random (25)));
- end;
- end;
- procedure GetSet (var f:textfile; var InSet:tab);
- var
- ch:ansichar;
- n:integer;
- begin
- n:=0;
- while not eof(f) do
- begin
- inc(n);
- while not eoln(f) do
- begin
- read (f, ch);
- setlength (InSet, n);
- include (InSet[n-1].x, ch);
- end;
- readln (f);
- end;
- end;
- function Hash1 (var x:SetCh):integer;
- var
- c:ansichar;
- i, k:integer;
- begin
- result:=0;
- i:=0;
- k:=51;
- for c in x do
- begin
- result:=result + ((ord(c) xor k) shl i);
- inc(i);
- end;
- end;
- function Hash2 (var x:SetCh):integer;
- var
- c:ansichar;
- i:integer;
- begin
- result:=0;
- i:=1;
- for c in x do
- begin
- result:=result + (ord(c) shl(i))*i;
- inc(i);
- end;
- end;
- function f1(x, y, z: byte): byte;
- begin
- result := x and y or not x and z;
- //result := x + y + z;
- end;
- function f2(x, y, z: byte): byte;
- begin
- result := x and z or not z and y;
- //result := -x + y + z;
- end;
- function f3(x, y, z: byte): byte;
- begin
- result := x xor y xor z;
- //result := x - y + z;
- end;
- function f4(x, y, z: byte): byte;
- begin
- result := y xor (not z or x);
- //result := x + y - z;
- end;
- function FHash(var s:SetCh): integer;
- var
- ch: char;
- a: byte ;
- b: byte ;
- c: byte;
- d: byte;
- begin
- a:= 5;
- b:= 59;
- c:= 167;
- d:= 211;
- for ch in s do
- begin
- a := a + f1(b, c, d) + ord(ch);
- a := (a shl 1) or (a shr 7);
- b := b + f2(c, d, a) + ord(ch);
- b := (b shl 3) or (b shr 5);
- c := c + f1(d, a, b) + ord(ch);
- c := (c shl 5) or (c shr 3);
- d := d + f1(a, b, c) + ord(ch);
- d := (d shl 7) or (d shr 1);
- end;
- result := a;
- result := (result shl 8) or b;
- // result * 256 + b
- result := (result shl 8) or c;
- // result * 256 + c
- result := (result shl 8) or d;
- // result * 256 + d
- end;
- procedure Hashing (var b:tab; HFunc:Hash);
- var
- i:integer;
- begin
- for i := 0 to length(b) -1 do
- begin
- b[i].flg:=false;
- b[i].h:=HFunc (b[i].x);
- end;
- end;
- procedure EqAndColl (var b:tab; var Eq:integer; var Coll:integer);
- var
- i, j:integer;
- flg:boolean;
- begin
- Eq:=0;
- Coll:=0;
- for i := 0 to length(b)-1 do
- if not b[i].flg then
- begin
- b[i].flg:=true;
- flg:=false;
- for j := i+1 to length (b)-1 do
- if (b[i].h = b[j].h) and not b[j].flg then
- begin
- b[j].flg:=true;
- if not ( b[i].x <> b[j].x )then
- begin
- if not flg then
- begin
- Eq:=Eq+2;
- flg:=true;
- end
- else
- inc(Eq);
- end
- else
- begin
- if not flg then
- begin
- Coll:=Coll+2;
- flg:=true;
- end
- else
- inc(Coll);
- end;
- end;
- end;
- end;
- begin
- assignfile (f, 'Base.txt');
- reset (f);
- readln (f, n);
- close (f);
- assignfile (f, 'input.txt');
- rewrite (f);
- MakeSet (f, n);
- close (f);
- assignfile (f, 'input.txt');
- reset (f);
- GetSet (f, a);
- close (f);
- assignfile (f, 'output.txt');
- rewrite (f);
- Hashing (a, Hash1);
- EqAndColl (a, Equallity, Collision);
- writeln (f, Equallity, Collision:5);
- Hashing (a, Hash2);
- EqAndColl (a, Equallity, Collision);
- writeln (f, Equallity, Collision:5);
- Hashing (a, FHash);
- EqAndColl (a, Equallity, Collision);
- writeln (f, Equallity, Collision:5);
- close (f);
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement