我有一个两个数组:char data1 [length]其中长度是8的倍数,即长度可以是8,16,24 ...该数组包含从文件中读取的二进制数据在二进制模式下打开。我会继续读取文件,每次读取时,我都会将读取值存储在散列表中。这个二进制数据的分布具有随机分布。我想散列每个数组并将它们存储在散列表中,以便能够再次查找具有特定数据的字符。完成这项任务会是一个很好的散列函数。谢谢适当的哈希函数哈希随机二进制字符串
请注意,我用C++和c写这个,所以你选择提供解决方案的任何语言都会很棒。
我有一个两个数组:char data1 [length]其中长度是8的倍数,即长度可以是8,16,24 ...该数组包含从文件中读取的二进制数据在二进制模式下打开。我会继续读取文件,每次读取时,我都会将读取值存储在散列表中。这个二进制数据的分布具有随机分布。我想散列每个数组并将它们存储在散列表中,以便能够再次查找具有特定数据的字符。完成这项任务会是一个很好的散列函数。谢谢适当的哈希函数哈希随机二进制字符串
请注意,我用C++和c写这个,所以你选择提供解决方案的任何语言都会很棒。
如果你读出的数据是8个字节长,真正随机分布的,和你的哈希代码必须是32位的,你看这个:
uint32_t hashcode(const unsigned char *data) {
uint32_t hash = 0;
hash ^= get_uint32_le(data + 0);
hash ^= get_uint32_le(data + 4);
return hash;
}
uint32_t get_uint32_le(const unsigned char *data) {
uint32_t value = 0;
value |= data[0] << 0;
value |= data[1] << 8;
value |= data[2] << 16;
value |= data[3] << 24;
return value;
}
如果需要更快的速度,这个代码可以或许做如果您可以保证data
总是正确对齐以解释为const uint32_t *
,则速度会快很多。
正如问题中提到的那样,长度是一个8的倍数的数字。我如何将您的想法扩展到8s而不仅仅是8字节? –
通过向散列码函数添加'size_t datalen'参数。当你了解代码时,这是一件微不足道的事情。我甚至写了代码,以便它可以很容易地扩展。 –
+1:虽然如果数据是真正的随机数据(我假设我们在这里的意思是“统一”),你甚至不需要xor;只需使用前32位作为散列。 –
我已经在我的一个项目中成功使用了MurmurHash3。
优点:
缺点:
这是一个很好的可能性,一个快速的哈希表实现......
我也想在我的项目上实现,实际上我想通过MurmurHash将字符串散列到二进制文件中。但Murmur哈希算法也会生成负散列值。所以我面临着问题。我实现上面提到的相同的代码。 它有任何哈希算法,给类似的消息提供相似的哈希值。例如,如果只有一个字符有变化,那么散列值的变化就会减少。 –
为什么不只是拿* Berkeley DB4 *并让该库处理所有细节? –
你会做什么关于哈希碰撞? –