7

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

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

4

3 回答 3

5

什么是保证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)。

于 2013-07-02T13:37:30.373 回答
0

改用一些众所周知的通用散列函数,例如 SHA,因为它们应该保证相同的字符串在任何地方都具有相同的散列。请注意,如果您正在做一些与安全相关的事情,SHA 可能会太快。说起来很奇怪,但有时快并不意味着好,因为它打开了暴力攻击的可能性 - 在这种情况下,还有其他较慢的哈希函数,其中一些基本上连续多次重新应用 SHA . 另一件事,如果您要对密码进行哈希处理,请记住对它们进行加盐(我不会详细说明,但这些信息很容易在线访问)。

于 2013-07-02T15:01:02.780 回答
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);
}
于 2013-07-05T05:07:59.490 回答