From 3d16ea67c380607528e7c8df0b2cc5a2f2636b9f Mon Sep 17 00:00:00 2001 From: kcwu Date: Wed, 12 Dec 2007 01:37:58 +0000 Subject: * uhash use userid="" to denote free slot for new register. However, such entries will have the same hash key. So we skip most of invalid userid to prevent lots of hash collision. git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@3672 63ad8ddf-47c3-0310-b6dd-a9e9d9715204 --- util/uhash_loader.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/util/uhash_loader.c b/util/uhash_loader.c index 3400e153..fe90a545 100644 --- a/util/uhash_loader.c +++ b/util/uhash_loader.c @@ -136,10 +136,40 @@ unsigned string_hash(unsigned char *s) return fnv1a_32_strcase(s, FNV1_32_INIT); } +// TODO share code with mbbsd/stuff.c +int is_validuserid(const char *id) +{ + int len, i; + if(id==NULL) + return 0; + len = strlen(id); + + if (len < 2 || len>IDLEN) + return 0; + + if (not_alpha(id[0])) + return 0; + for (i = 1; i < len; i++) + if (not_alnum(id[i])) + return 0; + return 1; +} + void userec_add_to_uhash(int n, userec_t *user, int onfly) { int *p, h, l=0; + // uhash use userid="" to denote free slot for new register + // However, such entries will have the same hash key. + // So we skip most of invalid userid to prevent lots of hash collision. + if (!is_validuserid(user->userid)) { + // dirty hack, preserve few slot for new register + static int count = 0; + count++; + if (count > 1000) + return; + } + h = string_hash(user->userid)%(1<hash_head[h]); -- cgit v1.2.3