C ++中是否有任何函数可以计算保证至少为64位宽的字符串的指纹或散列?
我想将unordered_map<string, int>
替换为unordered_map<long long, int>
。
鉴于我得到的答案(感谢Stack Overflow社区......)我所描述的技术并不为人所知。我想要一个无序的指纹图而不是字符串的原因是空间和速度。第二个映射不必存储字符串,并且在执行查找时,它不会导致任何额外的缓存未命中以获取这些字符串。唯一的缺点是碰撞的可能性很小。这就是为什么密钥必须是64位:2 ^( - 64)的概率基本上是不可能的。当然,这是基于良好的哈希函数,这正是我的问题所寻求的。
再次感谢Stack Overflowers。
答案 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)
您想要实现的目标究竟是什么?使用“更大”的哈希函数,你的地图不会更好。无论如何,并非值得注意。