\r
unit bsearchtree;\r
\r
+{$ifdef fpc}\r
+ {$mode delphi}\r
+{$endif}\r
interface\r
\r
uses blinklist;\r
{returns the item pointer for s, or nil if not found}\r
function findtree(t:phashtable;s:ansistring):pointer;\r
\r
+{clear a hashtable, deallocating all used resources}\r
+procedure cleartree(t:phashtable);\r
+\r
implementation\r
\r
+//FNV-1a hash function\r
function makehash(s:ansistring):integer;\r
const\r
shifter=6;\r
var\r
a,b:integer;\r
+ h:longword;\r
begin\r
result := 0;\r
b := length(s);\r
+ h := 216613626;\r
for a := 1 to b do begin\r
- result := (result shl shifter) xor byte(s[a]);\r
+ h := (h xor byte(s[a])) * 16777619;\r
end;\r
- result := (result xor result shr 16) and (hashtable_size-1);\r
+ result := h and (hashtable_size-1);\r
end;\r
\r
procedure addtree(t:phashtable;s:ansistring;item:pointer);\r
end;\r
end;\r
\r
+procedure cleartree(t:phashtable);\r
+var\r
+ hash:integer;\r
+ p,p2:thashitem;\r
+begin\r
+ for hash := 0 to hashtable_size-1 do begin\r
+ p := t[hash];\r
+ while p <> nil do begin\r
+ p2 := thashitem(p.next);\r
+ linklistdel(tlinklist(t[hash]),tlinklist(p));\r
+ p.destroy;\r
+ p := thashitem(p2);\r
+ end;\r
+ end;\r
+end;\r
+\r
end.\r