如果目标数据是一段内存区的话,该使用什么HASH算法比较合适?

如果目标数据是一段内存区的话,该使用什么HASH算法比较合适?

算法的选择标准:

尽量在不同的输入的情况下产生在合法区间的离散,不重复的输出。

有两种计算方法比较容易产生离散的输出:

1.异或运算

2.局部移位运算

基于以上思想,可以使用如下算法:

以字长为单位,将内存区从开始直至最后进行以上两种运算,直到余下的长度不够字长为止。

以字节为单位,对内存区余下的部分进行以上两种运算。

具体的运算代码如下:

ULONG hash_buffer( PBYTE *data, ULONG data_len )

{

    ULONG hash_val = 0;

    INT32 i;

    for( i = 0; i < data_len; i + sizeof( ULONG ) )

    {

        hash_val ^= *( PULONG )( data + i );

        hash_val = hash_val << 3;

    } 

    i -= sizeof( ULONG );

    for( ; i < data_len; i ++ )

    {

        hash_val ^= ( ULONG )( *data );

        hash_val = hash_val << 3;

    }

    return hash_val;

}

也可以使用以上算法:

1.与一个素数进行乘法运算

2.与字,字节相加

假定需要进行一段UNICODE字符串的HASH值计算,具体的代码如下:

#define mul_factor 37

ULONG unicode_str_hash( WCHAR *str, ULONG len )

{

    ULONG ch;

    ULONG hash_val = 0;

    INT32 i;

    for( i = 0; i < len; i ++ )

    {

        ch = _toupper_l(  str[ i ],  NULL );

        hash_val *= mul_factor;

        hash_val += ch;  

   }

    return hash_val;

}

猜你喜欢

转载自blog.csdn.net/CharlesPrince/article/details/6546690