1. 程式人生 > >如果目標資料是一段記憶體區的話,該使用什麼HASH演算法比較合適?

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

}