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

Mik*_*e G 5 c c++ algorithm hash

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

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

Rol*_*lig 3

如果你读取的数据是 8 个字节长并且真正随机分布,并且你的 hashcode 需要是 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;
}
Run Code Online (Sandbox Code Playgroud)

如果您需要更快的速度,如果您可以保证data始终正确对齐以解释为const uint32_t *.

  • +1:虽然如果数据确实是随机的(我假设我们在这里真正的意思是“均匀”),但你甚至不需要异或;只需使用前 32 位作为哈希值。 (2认同)