diff options
author | kcwu <kcwu@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2007-12-12 09:37:58 +0800 |
---|---|---|
committer | kcwu <kcwu@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2007-12-12 09:37:58 +0800 |
commit | 3d16ea67c380607528e7c8df0b2cc5a2f2636b9f (patch) | |
tree | da00f2f96a9f3385b70d444863ead797e7550d97 | |
parent | 1b204ee3a9867005c32f9620b28869e4faf2f39e (diff) | |
download | pttbbs-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.c | 30 |
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]); |