Charles.Forsyth20060303a828770d19 years agoHistory
80 lines · 1.4 KB · Brainfuck
RawDownload
# ehg@research.bell-labs.com 14Dec1996implement Hash; include "hash.m"; # from Aho Hopcroft Ullmanfun1(s:string, n:int):int{	h := 0;	m := len s;	for(i:=0; i<m; i++){		h = 65599*h+s[i];	}	return (h & 16r7fffffff) % n;} # from Limbo compilerfun2(s:string, n:int):int{	h := 0;	m := len s;	for(i := 0; i < m; i++){		c := s[i];		d := c;		c ^= c << 6;		h += (c << 11) ^ (c >> 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 HashNode);} HashTable.find(h: self ref HashTable, key: string): ref 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).val;			p.i = val.i;			p.r = val.r;			p.s = val.s;			return;		}	}	h.a[j] = HashNode(key,ref HashVal(val.i,val.r,val.s)) :: h.a[j];} HashTable.delete(h:self ref HashTable, key:string){	j := fun1(key,len h.a);	dl:list of 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 HashNode{	dl:list of HashNode; dl = nil;	for(j:=0; j<len h.a; j++)		for(q:=h.a[j]; q!=nil; q = tl q)			dl = (hd q) :: dl;	return dl;}