Add qt_hash(QStringRef) overload

This enables fixing a performance regression compared to Qt 4.
Also, add some qt_hash tests.

Change-Id: Id830e17dec99fb67e5930c80029ac2233b2f427e
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
bb10
Giuseppe D'Angelo 2013-04-27 01:02:06 +02:00 committed by The Qt Project
parent 0866e48ae2
commit 66ff3f7fa4
3 changed files with 44 additions and 4 deletions

View File

@ -235,17 +235,16 @@ static void qt_initialize_qhash_seed()
\internal
Private copy of the implementation of the Qt 4 qHash algorithm for strings,
(that is, QChar-based arrays, so all QString-like classes),
to be used wherever the result is somehow stored or reused across multiple
Qt versions. The public qHash implementation can change at any time,
therefore one must not rely on the fact that it will always give the same
results.
This function must *never* change its results.
The qt_hash functions must *never* change their results.
*/
uint qt_hash(const QString &key) Q_DECL_NOTHROW
static uint qt_hash(const QChar *p, int n) Q_DECL_NOTHROW
{
const QChar *p = key.unicode();
int n = key.size();
uint h = 0;
while (n--) {
@ -256,6 +255,24 @@ uint qt_hash(const QString &key) Q_DECL_NOTHROW
return h;
}
/*!
\internal
\overload
*/
uint qt_hash(const QString &key) Q_DECL_NOTHROW
{
return qt_hash(key.unicode(), key.size());
}
/*!
\internal
\overload
*/
uint qt_hash(const QStringRef &key) Q_DECL_NOTHROW
{
return qt_hash(key.unicode(), key.size());
}
/*
The prime_deltas array is a table of selected prime values, even
though it doesn't look like one. The primes we are using are 1,

View File

@ -92,6 +92,7 @@ Q_CORE_EXPORT uint qHash(const QStringRef &key, uint seed = 0) Q_DECL_NOTHROW;
Q_CORE_EXPORT uint qHash(const QBitArray &key, uint seed = 0) Q_DECL_NOTHROW;
Q_CORE_EXPORT uint qHash(QLatin1String key, uint seed = 0) Q_DECL_NOTHROW;
Q_CORE_EXPORT uint qt_hash(const QString &key) Q_DECL_NOTHROW;
Q_CORE_EXPORT uint qt_hash(const QStringRef &key) Q_DECL_NOTHROW;
#if defined(Q_CC_MSVC)
#pragma warning( push )

View File

@ -75,6 +75,9 @@ private slots:
void const_shared_null();
void twoArguments_qHash();
void initializerList();
void qthash_data();
void qthash();
};
struct Foo {
@ -1330,5 +1333,24 @@ void tst_QHash::initializerList()
#endif
}
void tst_QHash::qthash_data()
{
QTest::addColumn<QString>("key");
QTest::addColumn<uint>("hash");
QTest::newRow("null") << QString() << 0u;
QTest::newRow("empty") << QStringLiteral("") << 0u;
QTest::newRow("abcdef") << QStringLiteral("abcdef") << 108567222u;
QTest::newRow("tqbfjotld") << QStringLiteral("The quick brown fox jumps over the lazy dog") << 140865879u;
QTest::newRow("42") << QStringLiteral("42") << 882u;
}
void tst_QHash::qthash()
{
QFETCH(QString, key);
const uint result = qt_hash(key);
QTEST(result, "hash");
}
QTEST_APPLESS_MAIN(tst_QHash)
#include "tst_qhash.moc"