【问题标题】:Get 32-bit hash value from boost::hash从 boost::hash 获取 32 位哈希值
【发布时间】:2013-06-29 20:58:42
【问题描述】:

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

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

【问题讨论】:

  • 假设,如果你依赖于总是获得相同的哈希值并且 boost 稍微改变他们的算法会发生什么?
  • @Mark B,它可能会导致可移植性问题。在最简单的情况下,您可能希望将来自不同平台的散列字符串收集到一个数据结构中,并且桶分布是随机的
  • 是否有可能在其中一种情况下使用 unicode 而在另一种情况下不使用?
  • boost:hash(hash_value) 返回 std:size_t,所以在 64 位系统中返回 64 位长,在 32 位系统中返回 32 位长。
  • 我刚刚看了boost::hash的实现。在实践中,除了一个空字符串(它会散列为 0),你几乎可以保证得到不同的结果,具体取决于 size_t 的大小。

标签: c++ boost hash


【解决方案1】:

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)。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 既然他问到boost::hash,我怀疑他是否担心密码安全。对于数据访问的散列,SHA 的速度要慢得多,而且它生成的散列有足够的位,你需要一个大数字包来对其进行取模,以将其降低到范围内。
    【解决方案3】:

    上面的散列函数很简单,但很弱且易受攻击。

    例如,将“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);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-03-23
      • 2015-10-01
      • 2016-04-09
      • 2012-10-31
      • 1970-01-01
      • 2016-07-22
      • 1970-01-01
      • 2021-02-20
      • 2011-04-20
      相关资源
      最近更新 更多