计算qHash
的{{1}}值的最佳方法是什么?我需要使用QRect
(可能QRect
)作为QRectF
的关键字。现在我正在使用这样的东西:
QCache
它似乎有用,但我不喜欢把它转换成一些原始字节,因为QRect不是一个简单的结构,这可能会在未来版本的Qt中更快地破坏。
顺便说一句。我不存储哈希值,因此它不必是持久的或跨平台的。但它确实需要可靠和快速。
感谢。
答案 0 :(得分:2)
我只会做return qHash(QString("%1,%2,%3,%4").arg(r.x()).arg(r.y()).arg(r.width()).arg(r.height())))
我也找到了这个解决方案:http://thesmithfam.org/blog/2008/01/17/using-qrect-with-qhash/(阅读评论)
答案 1 :(得分:1)
那么,怎么样:
inline uint qHash(const QRect & r)
{
return qHash(r.left()) + qHash(r.top()) + qHash(r.width()) + qHash(r.bottom());
}
答案 2 :(得分:1)
如何简单地对每个整数进行异或?据我所知,qHash(QPair< ..>)执行此操作(已经为两个项目计算了qHashes)。
inline uint qHash(const QRect & r)
{
return qHash(r.left() ^ r.top() ^ r.right() ^ r.bottom());
// or
return qHash(r.left()) ^ qHash(r.top()) ^
qHash(r.right()) ^ qHash(r.bottom());
}
QRectF也一样:
inline uint qHash(const QRectF & r)
{
return qHash(r.left()) ^ qHash(r.top()) ^
qHash(r.right()) ^ qHash(r.bottom());
}
(请注意,即使向下舍入到整数也不意味着您的缓存将无法正常工作 - 只是哈希表“欺骗”了一点。)
答案 3 :(得分:0)
我认为这是> = Qt5.4:
的最佳解决方案uint qHash(const QRect& r)
{
int data[4];
data[0] = r.left();
data[1] = r.top();
data[2] = r.width();
data[3] = r.height();
return qHashBits(data, 4 * sizeof(int));
}
对于低于5.4的Qt版本,我们必须以这种方式写出不太优的:
uint qHash(const QRect& r)
{
QByteArray data(sizeof(int) * 4, 0);
int* d = reinterpret_cast<int*>(data.data());
d[0] = r.left();
d[1] = r.top();
d[2] = r.width();
d[3] = r.height();
return qHash(data);
}