2011-11-05 70 views
5

我有一个两个数组:char data1 [length]其中长度是8的倍数,即长度可以是8,16,24 ...该数组包含从文件中读取的二进制数据在二进制模式下打开。我会继续读取文件,每次读取时,我都会将读取值存储在散列表中。这个二进制数据的分布具有随机分布。我想散列每个数组并将它们存储在散列表中,以便能够再次查找具有特定数据的字符。完成这项任务会是一个很好的散列函数。谢谢适当的哈希函数哈希随机二进制字符串

请注意,我用C++和c写这个,所以你选择提供解决方案的任何语言都会很棒。

+0

为什么不只是拿* Berkeley DB4 *并让该库处理所有细节? –

+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 *,则速度会快很多。

+0

正如问题中提到的那样,长度是一个8的倍数的数字。我如何将您的想法扩展到8s而不仅仅是8字节? –

+0

通过向散列码函数添加'size_t datalen'参数。当你了解代码时,这是一件微不足道的事情。我甚至写了代码,以便它可以很容易地扩展。 –

+2

+1:虽然如果数据是真正的随机数据(我假设我们在这里的意思是“统一”),你甚至不需要xor;只需使用前32位作为散列。 –

2

我已经在我的一个项目中成功使用了MurmurHash3

优点:

  • 这是非常快
  • 它应该是低冲突率。

缺点:

  • 它不适合加密的应用程序。
  • 它没有任何形状或形式的标准化。
  • 它不能移植到非x86平台。但是,如果您真的需要,它应该能够移植它,但它足够小 - 我可以将它移植到Java,但这几乎不是一回事。

这是一个很好的可能性,一个快速的哈希表实现......

+0

我也想在我的项目上实现,实际上我想通过MurmurHash将字符串散列到二进制文件中。但Murmur哈希算法也会生成负散列值。所以我面临着问题。我实现上面提到的相同的代码。 它有任何哈希算法,给类似的消息提供相似的哈希值。例如,如果只有一个字符有变化,那么散列值的变化就会减少。 –