MurmurHash3的C代码中有如下的部分:
uint64_t k1 = 0;
uint64_t k2 = 0;
switch(len & 15)
{
case 15: k2 ^= ((uint64_t)tail[14]) << 48;
case 14: k2 ^= ((uint64_t)tail[13]) << 40;
case 13: k2 ^= ((uint64_t)tail[12]) << 32;
case 12: k2 ^= ((uint64_t)tail[11]) << 24;
case 11: k2 ^= ((uint64_t)tail[10]) << 16;
case 10: k2 ^= ((uint64_t)tail[ 9]) << 8;
case 9: k2 ^= ((uint64_t)tail[ 8]) << 0;
(tail
的类型是uint8_t *
)
就我所看到的,它与OR操作没有什么不同。在这里使用XOR有什么区别呢?这是一种优化吗?如果是的话,是哪种优化?还是说我对这两个运算符的差异存在误解?
我已经知道XOR和OR之间的差异。但在这种情况下,由于在开始时将值清零并且XOR的值不重叠,因此行为根本不应该与OR有任何不同。所以我想知道为什么作者选择了XOR(在我看来,OR传达了它的意图要比XOR好)。
OR
,那我们也可以说作者应该直接使用ADD
。 - smac89