C ++中是否有任何函数可以计算保证至少为64位宽的字符串的指纹或散列?

时间:2009-05-25 22:12:35

标签: c++ stl boost

C ++中是否有任何函数可以计算保证至少为64位宽的字符串的指纹或散列?

我想将unordered_map<string, int>替换为unordered_map<long long, int>

鉴于我得到的答案(感谢Stack Overflow社区......)我所描述的技术并不为人所知。我想要一个无序的指纹图而不是字符串的原因是空间和速度。第二个映射不必存储字符串,并且在执行查找时,它不会导致任何额外的缓存未命中以获取这些字符串。唯一的缺点是碰撞的可能性很小。这就是为什么密钥必须是64位:2 ^( - 64)的概率基本上是不可能的。当然,这是基于良好的哈希函数,这正是我的问题所寻求的。

再次感谢Stack Overflowers。

4 个答案:

答案 0 :(得分:3)

unordered_map始终将密钥哈希到size_t变量中。这与密钥的类型无关,仅取决于您正在使用的体系结构。

答案 1 :(得分:2)

如果要将任何字符串映射到唯一的整数:

typedef std::map<string,long long> Strings;
static Strings s_strings;
long long s_highWaterMark = 0;
long long my_function(const string& s)
{
  Strings::const_iterator it = s_strings.find(s);
  if (it != s_strings.end())
  {
    //we've previously returned a fingerprint for this string
    //now return the same fingerprint again
    return it->second;
  }
  //else new fingerprint
  long long rc = ++s_highWaterMark;
  //... remember it for next time
  s_strings.insert(Strings::value_type(s, rc));
  //... and return it this time
  return rc;
}

答案 2 :(得分:2)

c ++没有本机128位类型,也没有本机哈希支持。这种散列扩展应该在TR1中添加,但据我所知,我的许多编译器不支持128位整数。 (Microsoft支持__int128类型 - 但仅限于x64平台上)

我希望unordered_map中包含的函数在任何情况下都会更快。

如果你真的想这样做,MD5提供了一个很好的128位散列。

答案 3 :(得分:0)

您想要实现的目标究竟是什么?使用“更大”的哈希函数,你的地图不会更好。无论如何,并非值得注意。