void *
。更具体地说,模板如下:
void MurmurHash3_x86_32 (const void *key, int len, uint32_t seed, void *out);
由于我的哈希表大小将小于它可以生成的最大哈希值,因此我需要将其放入表范围[0,N-1]内。最简单的解决方案似乎是使用%
运算符。但是,由于已知它是一个慢速运算符,我想知道是否有更快的方法来解决这个问题。
我找到了一条有趣的建议,来自于StackOverflow,与C/C++中使用模(%)运算符有关。它建议使用“2的幂次方,以下代码可以实现(假设使用二进制补码表示)”:
return i & (n-1);
我的问题是,在新的CPU上,由于多路高速缓存,当大小接近2^n时,性能有时会下降(或者说大部分情况下都会下降),这个我记得。这个链接提供了一个关于插入的说明Big Memory, Part 3.5: Google sparsehash!。
目前,murmur3的优势似乎被硬件相关问题和已知的%
运算符的低效率所抵消。由于性能是一个约束条件,即使不是MurmurHash3_x86_32,我也要求满足我的需求的低延迟和更快的解决方案。