From f2859177d31a5f8bb14281baf43c30c5880d9eb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net> Date: Tue, 9 Mar 1999 18:41:18 -0800 Subject: [PATCH] hash patched Rev: src/builtin_functions.c:1.154 Rev: src/pike_memory.c:1.34 Rev: src/pike_memory.h:1.10 --- src/builtin_functions.c | 25 +++++++++++++++++++++++-- src/pike_memory.c | 19 ++++++++++++++++++- src/pike_memory.h | 5 ++++- 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/builtin_functions.c b/src/builtin_functions.c index 628e5ccd2f..7a3fe5ecba 100644 --- a/src/builtin_functions.c +++ b/src/builtin_functions.c @@ -5,7 +5,7 @@ \*/ /**/ #include "global.h" -RCSID("$Id: builtin_functions.c,v 1.153 1999/02/28 17:07:40 grubba Exp $"); +RCSID("$Id: builtin_functions.c,v 1.154 1999/03/10 02:41:15 hubbe Exp $"); #include "interpret.h" #include "svalue.h" #include "pike_macros.h" @@ -94,7 +94,28 @@ void f_hash(INT32 args) PIKE_ERROR("hash", "Too few arguments.\n", sp, 0); if(sp[-args].type != T_STRING) PIKE_ERROR("hash", "Bad argument 1.\n", sp, args); - i=hashstr((unsigned char *)sp[-args].u.string->str,100); + + switch(sp[-args].u.string->size_shift) + { + case 0: + i=hashstr((unsigned char *)sp[-args].u.string->str,100); + break; + + case 1: + i=simple_hashmem((unsigned char *)sp[-args].u.string->str, + sp[-args].u.string->len << 1, + 200); + break; + + case 2: + i=simple_hashmem((unsigned char *)sp[-args].u.string->str, + sp[-args].u.string->len << 2, + 400); + break; + + default: + fatal("Foo!\n"); + } if(args > 1) { diff --git a/src/pike_memory.c b/src/pike_memory.c index 6600c7b1d2..607fc0eec9 100644 --- a/src/pike_memory.c +++ b/src/pike_memory.c @@ -10,7 +10,7 @@ #include "pike_macros.h" #include "gc.h" -RCSID("$Id: pike_memory.c,v 1.33 1999/03/05 02:15:02 hubbe Exp $"); +RCSID("$Id: pike_memory.c,v 1.34 1999/03/10 02:41:17 hubbe Exp $"); /* strdup() is used by several modules, so let's provide it */ #ifndef HAVE_STRDUP @@ -242,6 +242,23 @@ unsigned INT32 hashstr(const unsigned char *str,INT32 maxn) return ret; } +unsigned INT32 simple_hashmem(const unsigned char *str,INT32 len, INT32 maxn) +{ + unsigned INT32 ret,c; + + ret=len*92873743; + + len=MINIMUM(maxn,len); + for(; len>=0; len--) + { + c=str++[0]; + ret ^= ( ret << 4 ) + c ; + ret &= 0x7fffffff; + } + + return ret; +} + /* * a quick memory search function. diff --git a/src/pike_memory.h b/src/pike_memory.h index a976141dc1..142079081f 100644 --- a/src/pike_memory.h +++ b/src/pike_memory.h @@ -5,7 +5,7 @@ \*/ /* - * $Id: pike_memory.h,v 1.9 1999/02/27 21:53:44 grubba Exp $ + * $Id: pike_memory.h,v 1.10 1999/03/10 02:41:18 hubbe Exp $ */ #ifndef MEMORY_H #define MEMORY_H @@ -60,6 +60,7 @@ struct generic_mem_searcher #define MEMCHR0 MEMCHR /* Prototypes begin here */ +char *strdup(const char *str); int pcharp_memcmp(PCHARP a, PCHARP b, int sz); INLINE p_wchar1 *MEMCHR1(p_wchar1 *p,p_wchar1 c,INT32 e); INLINE p_wchar2 *MEMCHR2(p_wchar2 *p,p_wchar2 c,INT32 e); @@ -68,6 +69,7 @@ void reverse(char *memory, INT32 nitems, INT32 size); void reorder(char *memory, INT32 nitems, INT32 size,INT32 *order); unsigned INT32 hashmem(const unsigned char *a,INT32 len,INT32 mlen); unsigned INT32 hashstr(const unsigned char *str,INT32 maxn); +unsigned INT32 simple_hashmem(const unsigned char *str,INT32 len, INT32 maxn); void init_memsearch(struct mem_searcher *s, char *needle, SIZE_T needlelen, @@ -94,6 +96,7 @@ void memfill(char *to, char *from, INT32 fromlen, INT32 offset); + /* Prototypes end here */ #undef BLOCK_ALLOC -- GitLab