SMTH中,为了提高用户搜索速度,采用了HASH,但是,由于系统不支持数字用户,所以,HASH设计的时候,在搜索用户第一个字母的时候,也只是使用了A-Z 26个英文字母,如果是小写的就把他转换成大写。可是如果想希望系统支持数字ID的情况下。就必须修改HASHTABLE了,已经一些HASH函数。如果不修改的话,会造成很多问题,比如:查询用户信息,查看数字用户信息,数字用户注册,登陆的速度相当慢。比普通帐户要慢好几倍。
不知道有没有哪个站点使用了SMTH,而且能够支持数字用户的交流一下,你们是如何修改HASH的呢?或者说,是否把HASH支持给取消掉了呢?
比如可以修改以下这段函数:修改一些n1的判断,让他也支持数字。
unsigned int ucache_hash(const char *userid)
{
int n1, n2, n, len;
ucache_hashtable *hash;
ucache_hashtable *usage;
if (!*userid)
return 0;
hash = &uidshm->hashtable;
usage = &uidshm->hashusage;
n1 = *userid++;
if (n1 >= 'a' && n1 <= 'z')
n1 &= 0xdf;
n1 -= 'A';
if (n1 < 0 || n1 >= 26)
return 0;
/* disable it usage->hash0[n1]++;*/
n1 = hash->hash0[n1];
while (n1 < 0) {
n1 = -n1 - 1;
if (!*userid) {
/* disable it usage->hash[n1][0]++; */
n1 = hash->hash[n1][0];
} else {
n2 = *userid++;
if (n2 >= 'a' && n2 <= 'z') {
n2 -= 'a' - 10;
} else if (n2 >= 'A' && n2 <= 'Z') {
n2 -= 'A' - 10;
} else {
n2 -= '0';
}
if (n2 < 0 || n2 >= 36)
return 0;
/* disable it usage->hash[n1][n2]++; */
n1 = hash->hash[n1][n2];
}
}
n1 = (n1 * UCACHE_HASHBSIZE) % UCACHE_HASHSIZE + 1;
if (!*userid)
return n1;
n2 = 0;
len = strlen(userid);
while (*userid) {
n = *userid++;
if (n >= 'a' && n <= 'z') {
n -= 32;
}
n2 += (n - 47) * len;
len--;
}
n1 = (n1 + n2 % UCACHE_HASHBSIZE) % UCACHE_HASHSIZE + 1;
return n1;
}
--
FROM 202.118.1.*