summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkcwu <kcwu@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2007-12-12 09:37:58 +0800
committerkcwu <kcwu@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2007-12-12 09:37:58 +0800
commit3d16ea67c380607528e7c8df0b2cc5a2f2636b9f (patch)
treeda00f2f96a9f3385b70d444863ead797e7550d97
parent1b204ee3a9867005c32f9620b28869e4faf2f39e (diff)
downloadpttbbs-3d16ea67c380607528e7c8df0b2cc5a2f2636b9f.tar
pttbbs-3d16ea67c380607528e7c8df0b2cc5a2f2636b9f.tar.gz
pttbbs-3d16ea67c380607528e7c8df0b2cc5a2f2636b9f.tar.bz2
pttbbs-3d16ea67c380607528e7c8df0b2cc5a2f2636b9f.tar.lz
pttbbs-3d16ea67c380607528e7c8df0b2cc5a2f2636b9f.tar.xz
pttbbs-3d16ea67c380607528e7c8df0b2cc5a2f2636b9f.tar.zst
pttbbs-3d16ea67c380607528e7c8df0b2cc5a2f2636b9f.zip
* 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
-rw-r--r--util/uhash_loader.c30
1 files changed, 30 insertions, 0 deletions
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_BITS);
p = &(SHM->hash_head[h]);