我正在查看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位版本。我的问题是,我不明白它是如何通过你发送的密钥的。例如,如果我向它发送一个指向字符串"ABC“的指针。我可以看到,我将向它发送一个指向第一个字符"A“的指针,长度为3。
我有限的数据知识告诉我,它创建了一个指针‘C++’,它指向与传入指针相同的位置。但是它通过获取'data‘并加上字符串的长度除以8来计算键值的末尾。因此,如果键值小于8,while循环就不会被触发,第一步的数学运算也不会完成。有人知道为什么会被8整除吗?
是不是因为第一个数学比特只适用于8个字符及以上的密钥(如果是这样,为什么)?
提前谢谢。C
发布于 2010-10-20 23:08:21
该算法一次处理8个字节的数据(uint64_t是8个字节)。第一个循环将组合所有8个字节的集合,以生成8个字节的单个密钥。然后,开关将使用剩余的字节(在您的示例中传递“ABC”的全部3个字节),并对其进行处理以将它们考虑到最终结果中。
https://stackoverflow.com/questions/3979207
复制相似问题