如果目标数据是一段内存区的话,该使用什么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;
}