Функция qHash для QRect - PullRequest
       6

Функция qHash для QRect

2 голосов
/ 08 ноября 2010

Каков наилучший способ вычисления qHash значения QRect?Мне нужно использовать QRect (и, возможно, QRectF) в качестве ключа QCache.Прямо сейчас я использую что-то вроде этого:

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

Кажется, это работает, но мне не нравится преобразовывать его в некоторые необработанные байты, и, поскольку QRect не является простой структурой, она может сломаться раньше, чем позжебудущие версии Qt.

Кстати.Я не храню значения хешей, поэтому он не должен быть постоянным или кроссплатформенным.Но это должно быть надежно и быстро.

Спасибо.

Ответы [ 4 ]

2 голосов
/ 08 ноября 2010

Я бы просто сделал 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 голос
/ 21 июля 2011

Как насчет просто XORing каждого целого числа?Насколько я знаю, 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());
}

(Обратите внимание, что даже округление до целых чисел НЕ означает, что ваш кеш будет работать неправильно - только хеш-таблица немного «обманывает».)

1 голос
/ 08 ноября 2010

Ну, как насчет:

inline uint qHash(const QRect & r)
{
    return qHash(r.left()) + qHash(r.top()) + qHash(r.width()) + qHash(r.bottom());
}  
0 голосов
/ 27 июля 2016

Я думаю, что это наиболее оптимальное решение для> = 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));
}

Для версий Qt ниже 5.4 мы должны написать менее оптимально таким образом:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...