QRect的qHash函数

时间:2010-11-08 01:25:16

标签: c++ qt hash

计算qHash的{​​{1}}值的最佳方法是什么?我需要使用QRect(可能QRect)作为QRectF的关键字。现在我正在使用这样的东西:

QCache

它似乎有用,但我不喜欢把它转换成一些原始字节,因为QRect不是一个简单的结构,这可能会在未来版本的Qt中更快地破坏。

顺便说一句。我不存储哈希值,因此它不必是持久的或跨平台的。但它确实需要可靠和快速。

感谢。

4 个答案:

答案 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);
}