从boost :: hash获取32位哈希值

时间:2013-07-02 13:08:16

标签: c++ boost hash

我正在使用boost::hash来获取字符串的哈希值。 但它在Windows 32位和Debian 64位系统上为相同的字符串提供了不同的哈希值。

那么无论平台如何,我如何使用boost::hash获得相同的哈希值(32位或64位)?

3 个答案:

答案 0 :(得分:4)

boost::hash的保证是什么?我没有看到任何 保证生成的哈希码可以在。之外使用 产生它的过程。 (经常出现这种情况 哈希函数。)如果需要外部数据的哈希值, 适用于不同的程序和不同的平台(例如 对磁盘上的数据进行哈希访问),然后你必须编写你的 拥有。类似的东西:

uint32_t
hash( std::string const& key )
{
    uint32_t results = 12345;
    for ( auto current = key.begin(); current != key.end(); ++ current ) {
        results = 127 * results + static_cast<unsigned char>( *current );
    }
    return results;

}
只要您不必担心,

应该做到这一点 移植到一些异国情调的大型机(可能不支持 uint32_t)。

答案 1 :(得分:0)

使用一些众所周知的通用散列函数,例如SHA,因为它们应该保证相同的字符串在任何地方都具有相同的散列。请注意,如果您正在执行与安全相关的操作,则SHA可能太快。这是一个奇怪的事情,但有时快并不意味着好,因为它开启了暴力攻击的可能性 - 在这种情况下,还有其他较慢的哈希函数,其中一些基本上连续多次重新应用SHA 。另一件事,如果你是哈希密码,记得加盐(我不会详细介绍,但信息可以在网上轻松访问)。

答案 2 :(得分:0)

上面的哈希函数很简单,但很脆弱。

例如,传递给那个函数字符串,如“bb”“bbbb”“bbddbb”“ddffbb” - 对符号甚至ASCII码的任意组合,并注意低字节。 它总是57岁。

相反,我建议使用相对轻量级的哈希函数 并且没有容易的漏洞:

#define NLF(h, c) (rand[(uint8_t)(c ^ h)])
uint32_t rand[0x100] = { 256 random non-equal values };

uint32_t oleg_h(const char *key) {
  uint32_t h = 0x1F351F35;
  char c;
  while(c = *key++)
    h = ((h >> 11) | (h << (32 - 11))) + NLF(h, c);
  h ^= h >> 16;
  return h ^ (h >> 8);
}