一对 long long 的哈希函数?
我需要将一对 long long
映射到一个 double
,但我不确定要使用什么哈希函数。 每对可以由任意两个数字组成,尽管实际上它们通常是 0
到 100
之间的数字(但同样,这不能保证)。
这里是tr1::unordered_map
文档。 我是这样开始的:
typedef long long Int;
typedef std::pair<Int, Int> IntPair;
struct IntPairHash {
size_t operator(const IntPair& p) const {
return ...; // how to hash the pair?
}
};
struct IntPairEqual {
bool operator(const IntPair& a, const IntPair& b) const {
return a.first == b.first
&& a.second == b.second;
}
};
tr1::unordered_map<IntPair, double, IntPairHash, IntPairEqual> myMap;
一般来说,我永远不确定要使用什么哈希函数。 什么是好的通用哈希函数?
I need to map a pair of long long
to a double
, but I'm not sure what hash function to use. Each pair may consist of any two numbers, although in practice they will usually be numbers between 0
and about 100
(but again, that's not guaranteed).
Here is the tr1::unordered_map
documentation. I started like this:
typedef long long Int;
typedef std::pair<Int, Int> IntPair;
struct IntPairHash {
size_t operator(const IntPair& p) const {
return ...; // how to hash the pair?
}
};
struct IntPairEqual {
bool operator(const IntPair& a, const IntPair& b) const {
return a.first == b.first
&& a.second == b.second;
}
};
tr1::unordered_map<IntPair, double, IntPairHash, IntPairEqual> myMap;
In general, I'm never sure what hash function to use. What's a good general-purpose hash function?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
boost::hash 形成函数库。
或者自己写。 最简单的版本 =pair.first * max_second_value +pair.second
boost::hash form functional library.
or write your own. simplest version = pair.first * max_second_value + pair.second
对一对进行哈希处理的自然方法是以某种方式组合其组件的哈希值。 最简单的方法就是使用异或:
请注意,此哈希对 (1,1) 或 (2,2) 全部为零,因此您可能需要使用一些更复杂的方法来组合各个部分的哈希值,具体取决于您的数据。 Boost 做了这样的事情:
The natural way to hash a pair is to combine the hashes of its components in some way. The most simple way is just with xor:
Note that this hashes pairs like (1,1) or (2,2) all to zero, so you might want to use some more complex way to combine the hashes of the parts, depending on your data. Boost does something like this:
建议:看看这个帖子:"我不明白
std::tr1 ::unordered_map
"。另外,有关 相等谓词和哈希谓词<的 Boost 文档/a> 也是一个好地方(以及这个 示例)。
A suggestion: Take a look at this SO post: "I don't understand
std::tr1::unordered_map
".Also, the Boost Documentation on Equality Predicates and Hash Predicates is a good place too (as well as this example).
你真的需要一个基于哈希的地图吗? 只要复杂性保证它能够解决您正在解决的问题,基于二叉树的通用映射就可以很好地工作。
Do you really need a hash based map? The general map based on a binary tree will work fine as long as the complexity guarantees it makes work for the problem you are solving.