编辑修复@schnaader发现的错误:它做了什么?此代码可能希望由6位旋转val
向左(顺时针方向)形成的那些补总和(编辑:不是产品,因为我以前说的) - 异或 - 即旋转的值和当前值m_Hash
,以产生新的m_Hash
。新的m_Hash
将在下次调用AddHash()
时使用。
但是,写入的代码有一个错误:它只向左旋转val
的高位6位,留下val
的低位26位。然后将代码与xors合并为三个值:
- 新的低位(旧的高位)6位
val
;
- 原始的,未移位的低位26位的
val
;和
- 的
m_Hash
的电流值而使结果m_Hash
。
它是如何做到的?您可以将其映射出来并进行仿真:
val & 0x3FFFFFF
表示提取val
的低位26位。
xor
与m_Hash
的电流值的那些26个比特现在转向val
向右使得低阶26个比特脱落低位端,留下什么曾经是高位6位val
的低位6位val
。
- 掩码
0x3f
只提取那些低阶6位(如果一些无关位移入val
的高位部分)。
xor
那些当前值为m_Hash
的低6位给出新的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
和val == 0x03
,该函数将返回TRUE。
维基百科在按位运算上有一个很好的页面:http://en.wikipedia.org/wiki/Bitwise_operations。 – 2011-04-30 18:56:52