ElfHash算法与HashPJW算法

来源:互联网 发布:交管12123软件下载 编辑:程序博客网 时间:2024/06/08 05:54

最近遇到了两个hash算法,研究了一下,记个笔记。

如有错误望批评指正。


ElfHash算法

unsigned long ElfHash ( const unsigned char*name ){   unsigned long   h = 0, g;   while ( *name )    {           //h左移4位,并在最低8位加上name指向的字符           h = ( h << 4 ) + *name++;           //如果最高四位不为零,即h存放字符达到7个,第8个字符将无法存放。g存放h最高4位(29-32位)       if ( g = h & 0xF0000000 )       {              //h的5-8位与g的最高四位按位异或           h ^= g >> 24;             }       //清空h的最高四位       h &= ~g;    }   //返回h   return h;}


思路:

每次读入一个8位的字符;

先将原h左移4位,再加上读入的字符;

判断最高4位是否为0000(一般在第7次循环时候最高四位出现不全为零的情况);

若不全为0,则用最高4位与第5-8位进行杂糅;

然后将最高4位改写为0000;

然后进行下一次循环,直至到达字符串的结尾。

 

一共进行了两种杂糅:

第一种,unsigned char型字符占8位,而h每次左移4位,这样每次读入的新字符的最高4位会与5-8位进行杂糅;

第二种,当循环执行到第7次或第7次之后,最高4位不全为0时,用最高4位和5-8位进行杂糅。

 


 

HashPJW算法

 

//int的位数与char位数的乘积#define BITS_IN_int     ( sizeof(int) * CHAR_BIT )//BITS_IN_int的3/4#define THREE_QUARTERS  ((int) ((BITS_IN_int * 3) / 4))//BITS_IN_int的1/8#define ONE_EIGHTH         ((int) (BITS_IN_int / 8))/*0按位取反位      1111 1111 1111 1111 1111 1111 1111 1111 *右移ONE_EIGHTH位 0000 1111 1111 1111 1111 1111 1111 1111 *再按位取反为     1111 0000 0000 0000 0000 0000 0000 0000 */#define HIGH_BITS              ( ~((unsigned int)(~0) >> ONE_EIGHTH )) unsigned int HashPJW ( const char * datum ){       unsignedint hash_value, i;       //循环读入datum       for( hash_value = 0; *datum; ++datum )       {              //hash_value左移4位并在后8位加上datum              hash_value= ( hash_value << ONE_EIGHTH ) + *datum;              //如果最高4位不全为零,即hash_value存放字符达到7个,第8个字符将无法存放。       if (( i = hash_value & HIGH_BITS ) != 0 )       {              //hash_value与自己右移24位的结果按位异或并将最高4位全置为0              //结果存入hash_value                     hash_value=                ( hash_value ^ ( i >>THREE_QUARTERS )) &                        ~HIGH_BITS;       }       }       return( hash_value );}


思路:

每次读入一个8位的字符;

先将原h左移4位,再加上读入的字符;

判断最高4位是否为0000(一般在第7次循环时候最高四位出现不全为零的情况);

若不全为0,则用最高8位与第1-8位进行杂糅;

然后将最高4位改写为0000;

然后进行下一次循环,直至到达字符串的结尾。

 

一共进行了两种杂糅:

第一种,unsigned char型字符占8位,而h每次左移4位,这样每次读入的新字符的最高4位会与5-8位进行杂糅;

第二种,当循环执行到第7次或第7次之后,最高4位不全为0时,用最高8位和1-8位进行杂糅。

 

两算法唯一区别:

第二种杂糅进行时,ElfHash算法杂糅最高4位和第5-8位;HashPJW算法杂糅最高8位和第1-8位

 

原创粉丝点击