【发布时间】:2014-07-14 14:53:32
【问题描述】:
我正在尝试为矢量> 实现一个unordered_map。从there's no such default hash function开始,我试着想象一个我自己的功能:
struct ObjectHasher
{
std::size_t operator()(const Object& k) const
{
std::string h_string("");
for (auto i = k.vec.begin(); i != k.vec.end(); ++i)
{
h_string.push_back(97+i->first);
h_string.push_back(47); // '-'
h_string.push_back(97+i->second);
h_string.push_back(43); // '+'
}
return std::hash<std::string>()(h_string);
}
};
主要的想法是改变整数列表,比如 ( (97, 98), (105, 107) ) 变成像 "a-b+ik" 这样的格式化字符串 并通过 hash () 计算其哈希值。我选择 97、48 和 43 数字只是为了让哈希字符串在我的测试期间可以轻松地显示在终端中。
我知道这种函数可能是一个非常幼稚的想法,因为一个好的哈希函数应该是快速并且抗碰撞能力强。好吧,如果给 push_back() 的整数大于 255,我不知道会发生什么……那么,您如何看待以下问题:
- (1) 我的函数是否适用于大整数?
- (2) 我的功能适用于所有环境/平台吗?
- (3) 我的函数是否太慢而不能成为哈希函数?
- (4) ...你有什么更好的吗?
【问题讨论】:
-
编写一个好的 hast 函数可能非常困难。使用 std::map 而不是散列函数较差的 unordered_map 可能会更好。