适当的散列函数来散列随机二进制字符串

时间:2011-11-05 06:22:36

标签: c++ c algorithm hash

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

请注意,我用c ++和c编写本文,因此您选择提供解决方案的任何语言都会很棒。

2 个答案:

答案 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

优点:

  • 非常快
  • 据说它的碰撞率很低。

缺点:

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

很有可能用于例如快速哈希表实现......