代码之家  ›  专栏  ›  技术社区  ›  Stephen Chu

QRect的qHash函数

  •  2
  • Stephen Chu  · 技术社区  · 14 年前

    什么是计算 qHash 价值 QRect 心电图 QRectF )作为 QCache . 现在我用的是这样的东西:

    inline uint qHash(const QRect & r)
    {
     return qHash(QByteArray::fromRawData((const char*)&r, sizeof(r)));
    }
    

    它似乎可以工作,但我不喜欢将它转换成一些原始字节,而且由于QRect不是一个简单的结构,因此在Qt的未来版本中,这种情况可能会早于晚。

    顺便说一下,我不存储散列值,所以它不必是持久的或跨平台的。但它确实需要可靠和快速。

    谢谢。

    4 回复  |  直到 14 年前
        1
  •  3
  •   Kamil Klimek    14 年前

    我就这么做 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/ (阅读评论)

        2
  •  1
  •   Jeremy Friesner    14 年前

    那么,怎么样:

    inline uint qHash(const QRect & r)
    {
        return qHash(r.left()) + qHash(r.top()) + qHash(r.width()) + qHash(r.bottom());
    }  
    
        3
  •  1
  •   leemes    12 年前

    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());
    }
    

    (请注意,即使舍入为整数也不意味着缓存工作不正常—只是哈希表“作弊”了一点。)

        4
  •  0
  •   Navrocky    8 年前

    我认为这是>=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));
    }
    

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