mpq中hash表的一点理解

最近学习了hash表,还去网上找了些资料来看。网上比较推崇的一个hash运用就是mpq,暴雪公司的一个算法。具体请看下面链接:

十一、从头到尾彻底解析Hash表算法

MPQ技术内幕

insidemopaq

之前,研究了这个hash用法,有点认识;今天,照着抄写了一边,发现了另外的一些认识,主要是针对下面的这个hash函数:

下面这个函数是初始化hash表cryptTable:

void prepareCryptTable()
{
    unsigned long seed = 0x00100001, index1 = 0, index2 = 0, i;
    //分成5行*100列,一列一列进行初始化;在代码中,cryptTable初始化大小为0x500.
    for( index1 = 0; index1 < 0x100; index1++ )
    {
        for( index2 = index1, i = 0; i < 5; i++, index2 += 0x100 )
        {
            unsigned long temp1, temp2;
            seed = (seed * 125 + 3) % 0x2AAAAB;
            temp1 = (seed & 0xFFFF) << 0x10;
 
            seed = (seed * 125 + 3) % 0x2AAAAB;
            temp2 = (seed & 0xFFFF);
 
            cryptTable[index2] = ( temp1 | temp2 );
       }
   }
} 

下面这个函数是通过hash计算将字符串转换为整数:

unsigned long HashString( char *lpszFileName, unsigned long dwHashType )
{
    unsigned char *key  = (unsigned char *)lpszFileName;
    unsigned long seed1 = 0x7FED7FED;
    unsigned long seed2 = 0xEEEEEEEE;
    int ch;
 
    while( *key != 0 )
    {
        ch = toupper(*key++); 
        seed1 =cryptTable[(dwHashType << 8) + ch]^ (seed1 + seed2);
        seed2 = ch + seed1 + seed2 + (seed2 << 5) + 3;
    }
    return seed1;
}
如代码中表红的,暴雪的hash计算,首先是初始化了表 cryptTable;然后在这个函数中引用了这张表中的数据来进行hash计算。

其中,ch是字符值,最大为一个字节;dwHasType左移8位,那么就是第二字节(即填充高8bit)。那么,就是说cryptTable的大小是两个字节大小,最大为unsigned short(表再大,取不到这个这个位置的值,没有意义)。那么,dwHasType取值也要注意了,一定不能比cryptTable大小的高8bit值大(或者说,dwHasType<<8 超出cryptTable范围)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值