# ehg@research.bell-labs.com 14Dec1996 implement Hash; include "hash.m"; # from Aho Hopcroft Ullman fun1(s:string, n:int):int { h := 0; m := len s; for(i:=0; i> 1); h ^= (d << 14) + (d << 7) + (d << 4) + d; } return (h & 16r7fffffff) % n; } new(size: int):ref HashTable { return ref HashTable(array[size] of list of ref HashNode); } HashTable.find(h: self ref HashTable, key: string): HashVal { j := fun1(key,len h.a); for(q := h.a[j]; q!=nil; q = tl q){ if((hd q).key==key) return (hd q).val; } return nil; } HashTable.insert(h: self ref HashTable, key: string, val: HashVal) { j := fun1(key,len h.a); for(q := h.a[j]; q!=nil; q = tl q){ if((hd q).key==key){ p := hd q; p.val = val; return; } } h.a[j] = ref HashNode(key,val) :: h.a[j]; } HashTable.delete(h:self ref HashTable, key:string) { j := fun1(key,len h.a); dl:list of ref HashNode; dl = nil; for(q := h.a[j]; q!=nil; q = tl q){ if((hd q).key!=key) dl = (hd q) :: dl; } h.a[j] = dl; } HashTable.all(h:self ref HashTable): list of ref HashNode { dl:list of ref HashNode; dl = nil; for(j:=0; j