gpt4 book ai didi

c++ - Murmurhash3_x86_128 如何处理大于 15 字节的数据?

转载 作者:太空宇宙 更新时间:2023-11-04 03:58:10 25 4
gpt4 key购买 nike

我想在没有对手的重复数据删除系统中使用 MurmurHash3。例如,Murmurhash3 将对文件进行哈希处理。

但是我在使用它时遇到问题,这意味着我做错了什么。

Murmurhash3_x86_128() (source-code)函数接收四个参数。这是我对它们的理解:

key - 输入要散列的数据

len - 数据长度

种子 - 种子

out - 计算出的哈希值

由于这部​​分代码,运行时它因段错误而失败:

    void MurmurHash3_x86_128 ( const void * key, const uint32_t len,
uint32_t seed, void * out )
{
const uint8_t * data = (const uint8_t*)key;
const uint32_t nblocks = len / 16;
...

const uint32_t * blocks = (const uint32_t *)(data + nblocks*16);

for(i = -nblocks; i; i++)
{
uint32_t k1 = blocks[i*4];
...
}
...
}

因此,如果我的数据长度大于 15 个字节(就是这种情况),则会执行此 for 循环。但是,blocks 指向我的数据数组的末尾,然后它开始访问该位置之后的内存位置。解释了段错误。所以 key 不能只是我的数据数组。

我的问题是:我应该在 key 参数中输入什么?


问题已解决

在 Mats Petersson 的回答后,我意识到我的代码有一个错误。我必须是一个 int(有符号)并且我没有签名。这就是为什么它将内存位置添加到 block 而不是减去的原因。

最佳答案

blocks 指向正在计算的 block 中最后一个 16 字节的偶数倍。

i 从 -nblocks 开始,并且总是小于零(循环以零结束)。

所以,假设你有 64 字节的数据,那么指针 blocks 将指向 data + 64 字节,而 nblocks 将是4

当我们第一次到达 k1 = blocks[i*4]; 时,i = -4,所以我们得到索引 -16 - 乘以 sizeof(*blocks),即 4(在大多数架构中 int = 4 字节) - 所以我们得到 -64 = 的起始地址数据

关于c++ - Murmurhash3_x86_128 如何处理大于 15 字节的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14551875/

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