如果目標資料是一段記憶體區的話,該使用什麼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;
}