gpt4 book ai didi

c++ - MurmurHash - 它如何遍历 key ?

转载 作者:行者123 更新时间:2023-11-30 03:09:37 30 4
gpt4 key购买 nike

我正在查看 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com