| 发表于:2007-07-12 10:11:162楼 得分:10 |
hashtable.pas -------------------------------------------------------------------------------- unit hashtable; interface uses sysutils, classes; type { thashtable } pphashitem = ^phashitem; phashitem = ^thashitem; thashitem = record next: phashitem; key: string; value: string; end; thashtable = class private buckets: array of phashitem; protected function find(const key: string): pphashitem; function hashof(const key: string): cardinal; virtual; public constructor create(size: integer = 256); destructor destroy; override; procedure put(const key: string; value: string); procedure clear; procedure remove(const key: string); function modify(const key: string; value: string): boolean; function get(const key: string): string; end; implementation { thashtable } procedure thashtable.put(const key: string; value: string); var hash: integer; bucket: phashitem; begin hash := hashof(key) mod cardinal(length(buckets)); new(bucket); bucket^.key := key; bucket^.value := value; bucket^.next := buckets[hash]; buckets[hash] := bucket; end; procedure thashtable.clear; var i: integer; p, n: phashitem; begin for i := 0 to length(buckets) - 1 do begin p := buckets[i]; while p <> nil do begin n := p^.next; dispose(p); p := n; end; buckets[i] := nil; end; end; constructor thashtable.create(size: integer); begin inherited create; setlength(buckets, size); end; destructor thashtable.destroy; begin clear; inherited; end; function thashtable.find(const key: string): pphashitem; var hash: integer; begin hash := hashof(key) mod cardinal(length(buckets)); result := @buckets[hash]; while result^ <> nil do begin if result^.key = key then exit else result := @result^.next; end; end; function thashtable.hashof(const key: string): cardinal; var i: integer; begin result := 0; for i := 1 to length(key) do result := ((result shl 2) or (result shr (sizeof(result) * 8 - 2))) xor ord(key[i]); end; function thashtable.modify(const key: string; value: string): boolean; var p: phashitem; begin p := find(key)^; if p <> nil then begin result := true; p^.value := value; end else result := false; end; procedure thashtable.remove(const key: string); var p: phashitem; prev: pphashitem; begin prev := find(key); p := prev^; if p <> nil then begin prev^ := p^.next; dispose(p); end; end; function thashtable.get(const key: string): string; var p: phashitem; begin p := find(key)^; if p <> nil then result := p^.value else result := ' '; end; end. -------------------------------------------------------------------------------- 使用起来就简单了: hashtable := thashtable.create(); //创建 hashtable.put(key, value); //赋值 value=hashtable.get(key); //取值 hashtable.destroy; //撤消 | | |
|