- 论坛徽章:
- 0
|
原帖由 bbpet 于 2008-6-27 22:48 发表
这个ia64是个很普通的hp服务器,跟我上次测db2得出主索引0.1ms时的z990不可同日而语
连z990的零头的零头的零头的 …… 都不到~
毕竟国内能买得起(或者会买来用)z990的企业用手指头就能数出来了~
恩,快 ...
不知道你的Z990配了多少C, tpmC有多大. 你的ia64 4c/8g, 也不弱了. 不过, 对于单个DB查询或者bloom filter, 都只用到单个CPU的1/4以下资源.因此真正决定其速度的是单个CPU的频率. 不信的话,你可以只有HP上测试一下DB的性能. 我在自已笔记本上的装了个LINUX虚拟机,上面装了个ORACLE,查询一次也是<1ms, 当然, 我没法装入大量数据.
cpu的增加, 只提升了其并发处理的能力.
另外,碰撞的程度,与KEY值的离散程度有关, 越相似,碰撞的可能性就越大. google要8组,还是有其道理的.
补充一些测试数据.
我发现原来生成的名字, 过于离散, 而且名字前几个字符都不同.我想这就是碰撞不大的原因, 我觉得, 用户ID一般前面字符重复的多,因为前面几个字符通常是姓名的拼音或者英文名,而且以3-8个字符的为多,超过8个的少. 因此我修改了一下生成名字的程序, 生成的名字将如下:
aaaaaaaa;
aaaaaaab;
......
Z9999999;
......
Z________;
并增加碰撞结果的统计,程序如下:
static int
fillname()
{
inti;
intj;
intbit;
unsigned int code;
charusername[10];
intbits[10];
intres;
intcollision;
for (i=0; i<10; i++)
bits [ i ] =0;
memset(username, 0, 10);
collision=0;
for (i = STARTPOS; i < NAMESIZE; i++) {
for (j=0; j<8; j++)
username[j] = nametab[bits[j]];
bits[7] += 1;
for (j=7; j>=0; j--)
{
if (bits[j]==37)
{
bits[j]=0;
bits[j-1] += 1;
}
}
code = hash_larbin(username);
res = 0;
res=testSet1(code);
code = hash_php(username);
res += testSet2(code);
if (res==2)
collision++;
}
printf("%d names, %d collision\n", i, collision);
}
测试结果:
/home/house/tmp>./tt
126934395 names, 3293092 collision // 冲突
1214187341
2 ignore!
to ignore!
nice ignore!
great ignore!
aaaaaa ignore!
aaaaab ignore!
aaaaac ignore!
aaaaad ignore!
baaaaa ignore!
caaaaa ignore!
daaaaa ignore!
aaaaca ignore!
bbbbba ignore!
bbbbbb ignore!
bbbbbc ignore!
bbbbbd ignore!
abbbbb ignore!
bbbbbb known! // 误判
cbbbbb ignore!
dbbbbb ignore!
fi3a87 ignore!
fi3a8asfasvaf7 ignore!
1214187341
也就是说, 1.2亿个名字中,有3百多万是冲突的.
而且20多个检查中,就已经有一个误判.
说明了一点, 好的hash函数,很重要, 而且, 只靠2个,恐怕是不够的.
这里还是要感谢bbpet的热心,希望能找出更多更好的hash函数.
[ 本帖最后由 zszyj 于 2008-6-28 13:37 编辑 ] |
|