看懂ELF Hash

// 该ELF Hash Function将任意长度的字符串,最后变成28位二进制长度。
unsigned int ELFHash(char *str)
{
 unsigned int hash = 0;
 unsigned int x = 0;
 while (*str)
 {
      hash = (hash << 4) + (*str++);
  if ((x = hash & 0xF0000000L) != 0)
     {
       //因为1-4位刚刚存储了新加入到字符,所以不能>>28,如果是右移小于24位也是可以的吧??
      hash ^= (x >> 24);
      hash &= ~x;
      }
}
  return (hash & 0x7FFFFFFF);
}
(1)现在编译器中int和long int型都是32位。
(2)hash左移4位,把当前的ASCII存入hash低8位,单纯的二进制加的关系,前四位进行了一次杂糅,是为了更好的均匀性。
(3)为了使每个字符都被哈希到,因为初始化是0,在高四位不为0时,将高四位与低5-8位进行杂糅。下一步高四位被吃掉,新字符加入到低位。
     举例:加入ASCII 1000 1000 的字符
           初始h:   0000 0000 0000 0000 0000 0000 0000 0000 
加入一个字符:  0000 0000 0000 0000 0000 0000 1000 1000
加入二个字符:  0000 0000 0000 0000 0000 1000 1000 0000
                                                                              + 1000 1000
                           0000 0000 0000 0000 0000 1001 0000 1000
加入三个字符:  0000 0000 0000 0000 1001 0000 1000 0000
                                                                              + 1000 1000
                           0000 0000 0000 0000 1001 0001 0000 1000
                                   balabala
所以加入七个字符时,高四位将会非0.开始进行if{}处理
(4)假如最后结果是h为1100  1100  1100 1100 1100 1100 1100 1100
      x = hash & 0xF0000000L,取高四位结果是1100  0000 0000 0000 0000 0000 0000 0000
      x >> 24 ,右移24位0000  0000  0000 0000 0000 0000 1100 0000
      ^异或符号      h为1100  1100  1100 1100 1100 1100 1100 1100
      因为0与A(0||1)异或都是A,所以异或结果是h除低5-8位是新的杂糅,其余位保持原样。
      高四位已经杂糅到后面,下一步清零(左移),然后加入新字符。
     所以我猜右移4~24位都是可以得吧?
(5)最后的结果应该是28,最后一次 hash & 0x7FFFFFFF高位清0。

   请批评指教


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值