ELFhash----字符串哈希算法

ELFHash函数用来得到字符串哈希值,现做分析:

unsigned int ELFHash(char *str)
{
    unsigned int hash = 0;
    unsigned int x = 0;

    while (*str)
    {
        hash = (hash << 4) + (*str++);
        if ((x=hash & 0xf0000000)!=0)
            hash ^= x >> 24;
        hash &= ~x;
    }
    return (hash & 0x7fffffff);
}
  • 返回值是一个unsigned int类型的数据,即4个字节,32位,用16进制表示为0xXXXXXXXX
  • hash = (hash << 4) + (*str++)
    hash左移四位,并加上str的值(即字符串第一个字符的值,类型为char,1个字节,8位),即str的高四位与hash值的5~8位相加,低四位直接填充在hash左移4位后的低四位。
    《ELFhash----字符串哈希算法》
  • if ((hash & 0xf0000000)!=0)
    hash的值与0xf0000000相与,并且判断相与后的值是否为0,同时赋值给x。

    如果为0则说明字符不超过7个(因为每次左移4位,左移7次高4位还是0)。
    如果不为0,则说明下一次左移4位时将会把高4位移出,所以需要做些操作,来让hash值记住现在的高4位。
    
  • hash ^= x >> 24
    即把现在的高4位与5~8位进行相与操作,得到hash值,这样做就能让即将在下一个字符操作时被移出的高四位影响hash值
  • hash &= ~x
    高4位与高四位取反相与操作,即完成高4位清零
    《ELFhash----字符串哈希算法》
  • return (hash & 0x7fffffff)
    返回hash值与0x7ffffff相与的数,即返回了一个最高位为0的无符号数,也就是个符号为正的int,这样做应该是为了防止在函数外使用时产生溢出,不需要负数。
    原文作者:哈希算法
    原文地址: https://blog.csdn.net/Zach_z/article/details/79823605
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞