编辑以修复@schnaader 发现的错误:它的作用是什么?这段代码可能想要向左(顺时针)旋转val
6 位并形成补码和(编辑:不是乘积,正如我之前所说的)m_Hash
- xor - 该旋转值和to的当前值产生一个新的m_Hash
. m_Hash
下一次将使用新的AddHash( )
被调用。
但是,所编写的代码有一个错误:它只向左旋转了高 6 位val
,而将val
. 然后代码将三个值异或在一起:
- 新的低位(旧的高位)6位
val
;
- 的原始未移位的低 26 位
val
;和
- 的当前值
m_Hash
将结果留在m_Hash
.
它是如何做到的?你可以把它映射出来并模拟它:
val & 0x3FFFFFF
表示提取 的低位 26 位val
。
xor
当前值为的那些 26 位m_Hash
现在val
向右移动,使低 26 位从低位下降,将过去的高 6 位val
留在 的低 6 位中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,包括一些您可能不想要的情况。例如,如果m_Hash == 0xC0
和,该函数将返回 TRUE val == 0x03
。