我有两个数组:char data1 [length]其中length是8的倍数,即length可以是8,16,24 ......该数组包含从以二进制模式打开的文件中读取的二进制数据。我将继续读取文件,每次我读取我将读取值存储在哈希表中。这种二进制数据的分布具有随机分布。我想散列每个数组并将它们存储在哈希表中,以便能够再次查找具有特定数据的char。什么是一个很好的哈希功能来完成这项任务。感谢
请注意,我用c ++和c编写本文,因此您选择提供解决方案的任何语言都会很棒。
答案 0 :(得分:3)
如果您读取的数据长度为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 *
,则此代码可能会更快。
答案 1 :(得分:2)
我在其中一个项目中成功使用了MurmurHash3。
优点:
缺点:
很有可能用于例如快速哈希表实现......