From b422b11865a6243c070983e3a80ea226904f0edc Mon Sep 17 00:00:00 2001 From: Alexander Barton Date: Thu, 14 Mar 2002 15:49:36 +0000 Subject: [PATCH] - API fuer Hash() definiert. --- src/ngircd/hash.c | 50 ++++++++++++++++++++++++++--------------------- src/ngircd/hash.h | 5 ++++- 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/src/ngircd/hash.c b/src/ngircd/hash.c index 511dba15..d6cb516a 100644 --- a/src/ngircd/hash.c +++ b/src/ngircd/hash.c @@ -9,7 +9,7 @@ * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * - * $Id: hash.c,v 1.1 2002/03/14 15:31:22 alex Exp $ + * $Id: hash.c,v 1.2 2002/03/14 15:49:36 alex Exp $ * * hash.c: Hash-Werte berechnen */ @@ -24,6 +24,16 @@ #include "hash.h" +LOCAL UINT32 jenkins_hash( register UINT8 *k, register UINT32 length, register UINT32 initval); + + +GLOBAL UINT32 Hash( CHAR *String ) +{ + /* Hash-Wert ueber String berechnen */ + return jenkins_hash( String, strlen( String ), 42 ); +} /* Hash */ + + /* * Die hier verwendete Hash-Funktion stammt aus lookup2.c von Bob Jenkins * (URL: ). Aus dem Header: @@ -37,11 +47,7 @@ */ -typedef unsigned long int ub4; -typedef unsigned char ub1; - - -#define hashsize(n) ((ub4)1<<(n)) +#define hashsize(n) ((UINT32)1<<(n)) #define hashmask(n) (hashsize(n)-1) #define mix(a,b,c) \ @@ -55,17 +61,17 @@ typedef unsigned char ub1; a -= b; a -= c; a ^= (c>>3); \ b -= c; b -= a; b ^= (a<<10); \ c -= a; c -= b; c ^= (b>>15); \ -} +} /* mix */ -ub4 hash( register ub1 *k, register ub4 length, register ub4 initval) +LOCAL UINT32 jenkins_hash( register UINT8 *k, register UINT32 length, register UINT32 initval) { /* k: the key * length: length of the key * initval: the previous hash, or an arbitrary value */ - register ub4 a,b,c,len; + register UINT32 a,b,c,len; /* Set up the internal state */ len = length; @@ -75,9 +81,9 @@ ub4 hash( register ub1 *k, register ub4 length, register ub4 initval) /* handle most of the key */ while (len >= 12) { - a += (k[0] +((ub4)k[1]<<8) +((ub4)k[2]<<16) +((ub4)k[3]<<24)); - b += (k[4] +((ub4)k[5]<<8) +((ub4)k[6]<<16) +((ub4)k[7]<<24)); - c += (k[8] +((ub4)k[9]<<8) +((ub4)k[10]<<16)+((ub4)k[11]<<24)); + a += (k[0] +((UINT32)k[1]<<8) +((UINT32)k[2]<<16) +((UINT32)k[3]<<24)); + b += (k[4] +((UINT32)k[5]<<8) +((UINT32)k[6]<<16) +((UINT32)k[7]<<24)); + c += (k[8] +((UINT32)k[9]<<8) +((UINT32)k[10]<<16)+((UINT32)k[11]<<24)); mix(a,b,c); k += 12; len -= 12; } @@ -86,17 +92,17 @@ ub4 hash( register ub1 *k, register ub4 length, register ub4 initval) c += length; switch(len) /* all the case statements fall through */ { - case 11: c+=((ub4)k[10]<<24); - case 10: c+=((ub4)k[9]<<16); - case 9 : c+=((ub4)k[8]<<8); + case 11: c+=((UINT32)k[10]<<24); + case 10: c+=((UINT32)k[9]<<16); + case 9 : c+=((UINT32)k[8]<<8); /* the first byte of c is reserved for the length */ - case 8 : b+=((ub4)k[7]<<24); - case 7 : b+=((ub4)k[6]<<16); - case 6 : b+=((ub4)k[5]<<8); + case 8 : b+=((UINT32)k[7]<<24); + case 7 : b+=((UINT32)k[6]<<16); + case 6 : b+=((UINT32)k[5]<<8); case 5 : b+=k[4]; - case 4 : a+=((ub4)k[3]<<24); - case 3 : a+=((ub4)k[2]<<16); - case 2 : a+=((ub4)k[1]<<8); + case 4 : a+=((UINT32)k[3]<<24); + case 3 : a+=((UINT32)k[2]<<16); + case 2 : a+=((UINT32)k[1]<<8); case 1 : a+=k[0]; /* case 0: nothing left to add */ } @@ -104,7 +110,7 @@ ub4 hash( register ub1 *k, register ub4 length, register ub4 initval) /* report the result */ return c; -} /* hash */ +} /* jenkins_hash */ /* -eof- */ diff --git a/src/ngircd/hash.h b/src/ngircd/hash.h index 80caed89..aacce61d 100644 --- a/src/ngircd/hash.h +++ b/src/ngircd/hash.h @@ -9,7 +9,7 @@ * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * - * $Id: hash.h,v 1.1 2002/03/14 15:31:22 alex Exp $ + * $Id: hash.h,v 1.2 2002/03/14 15:49:36 alex Exp $ * * hash.h: Hash-Werte berechnen (Header) */ @@ -19,6 +19,9 @@ #define __hash_h__ +GLOBAL UINT32 Hash( CHAR *String ); + + #endif