首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MurmurHash -它是如何遍历密钥的?

MurmurHash -它是如何遍历密钥的?
EN

Stack Overflow用户
提问于 2010-10-20 22:55:24
回答 1查看 1.2K关注 0票数 1

我正在查看MurmurHash (sites.google.com/site/murmurhash/),我在某种程度上是在黑盒中使用它,而不是试图在这个阶段理解数学。

然而,我确实稍微看了一下代码,并担心它似乎是如何工作的……代码如下:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-10-20 23:08:21

该算法一次处理8个字节的数据(uint64_t是8个字节)。第一个循环将组合所有8个字节的集合,以生成8个字节的单个密钥。然后,开关将使用剩余的字节(在您的示例中传递“ABC”的全部3个字节),并对其进行处理以将它们考虑到最终结果中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3979207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档