@schnaaderが見つけたバグを修正するための編集:それは何をしますか?このコードは、おそらく左方向 (時計回り) に 6 ビット回転させ、1 の補数の合計(編集: 前に述べたように、積ではありません) を形成することを望んでいます。新しい を生成します。その新しいものは、次に呼び出されたときに使用されます。val
m_Hash
m_Hash
m_Hash
AddHash( )
ただし、記述されたコードにはバグがあります。 の上位 6 ビットのみをval
左に回転し、 の下位 26 ビットをそのまま残しますval
。次に、コードは 3 つの値を xor します。
- の新しい下位 (古い上位) 6 ビット
val
。
- ;の元のシフトされていない下位 26 ビット
val
。と
- の現在の値
m_Hash
結果を に残しm_Hash
ます。
それはどのように行うのですか?それをマップしてエミュレートするだけです:
val & 0x3FFFFFF
の下位 26 ビットを抽出することを意味しval
ます。
xor
の現在の値を持つそれらの 26 ビットm_Hash
の下位 6 ビットに の上位 6 ビットだったval
ものが残るように、下位 26 ビットが下位の端から削除されるように右にシフトします。val
val
- でマスクし
0x3f
て、これらの下位 6 ビットのみを抽出します (無関係なビットが の上位部分にシフトされた場合val
)。
xor
の現在の値を持つ下位 6 ビットはm_Hash
、新しい を提供しm_Hash
ます。
ハッシュの計算では、回転と排他的論理和が一般的な操作であることをご存知でしょう。
編集: @schnaader は、元のコードのバグを指摘しました: そのコードは、回転のもう一方の行を実行するのを忘れていました: 下位 26 ビットを左に 6 シフトします。それを修正するには、コードは次のように読む必要があります:
public void AddHash( int val )
{
m_Hash ^= ((val & 0x3FFFFFF) << 6);
m_Hash ^= (val >> 26) & 0x3F;
}
あなたのHasHash( )
機能に関して:あなたはそのことわざを知っておくべきです
return (m_Hash & val) == 0;
は、望ましくない場合も含め、多くの条件下で TRUE を返します。たとえば、関数は と の場合に TRUE を返しm_Hash == 0xC0
ますval == 0x03
。