作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在查看 MurmurHash (sites.google.com/site/murmurhash/)我正在以一种黑盒子的方式使用它,而不是在这个阶段试图理解数学。
但是,我确实稍微看了一下代码并且担心它看起来是如何工作的......这是代码:
uint64_t MurmurHash64A ( const void * key, int len, unsigned int seed )
{
const uint64_t m = 0xc6a4a7935bd1e995;
const int r = 47;
uint64_t h = seed ^ (len * m);
const uint64_t * data = (const uint64_t *)key;
const uint64_t * end = data + (len/8);
while(data != end)
{
uint64_t k = *data++;
k *= m;
k ^= k >> r;
k *= m;
h ^= k;
h *= m;
}
const unsigned char * data2 = (const unsigned char*)data;
switch(len & 7)
{
case 7: h ^= uint64_t(data2[6]) << 48;
case 6: h ^= uint64_t(data2[5]) << 40;
case 5: h ^= uint64_t(data2[4]) << 32;
case 4: h ^= uint64_t(data2[3]) << 24;
case 3: h ^= uint64_t(data2[2]) << 16;
case 2: h ^= uint64_t(data2[1]) << 8;
case 1: h ^= uint64_t(data2[0]);
h *= m;
};
h ^= h >> r;
h *= m;
h ^= h >> r;
return h;
}
请注意,这是适用于 64 位机器的 64 位版本。我的问题是我不明白它是如何通过你发送的 key 的。例如,如果我向它发送一个指向字符串“ABC”的指针。我可以看到我会向它发送一个指向第一个字符“A”且长度为 3 的指针。
我有限的 C++ 知识告诉我,它创建了一个指向与传入指针相同位置的指针“数据”。但是然后在其中通过获取“数据”并将字符串的长度除以 8 添加到它来计算 key 的结尾。因此,如果 key 小于 8,则不会触发 while 循环,并且不会完成第一部分的数学运算。有谁知道为什么要除以 8?
是否因为第一个数学位只适用于 8 个字符及以上的键(如果是,为什么)?
提前致谢。C
最佳答案
算法一次处理8个字节传递过来的数据(uint64_t是8个字节)。第一个循环将组合所有 8 字节的集合以生成一个 8 字节的 key 。然后开关将使用剩余的字节(在您的示例中传递“ABC”的所有 3 个字节)并处理它以将它们考虑到最终结果中。
关于c++ - MurmurHash - 它如何遍历 key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3979207/
我是一名优秀的程序员,十分优秀!