Copy Qt 4's QString hash algorithm.

We must do this the same way we do all other hash algorithms for fair
comparison, as otherwise, the call to the PLT unfairly penalises
QHash<QString>'s results, as it's in a different shared object.

Change-Id: I69c891f5a97dcccdfcfbdbf32796f86242a42963
Reviewed-by: João Abecasis <joao.abecasis@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Robin Burchell 2012-02-28 20:56:14 +01:00 committed by Qt by Nokia
parent 57004b7fda
commit 1f4804452c
3 changed files with 32 additions and 4 deletions

View File

@ -138,8 +138,11 @@ void tst_QHash::data()
void tst_QHash::qhash_qt4()
{
QFETCH(QStringList, items);
QStringList realitems = items; // for copy/paste ease between benchmarks
QHash<QString, int> hash;
QHash<Qt4String, int> hash;
QList<Qt4String> realitems;
foreach (const QString &s, items)
realitems.append(s);
QBENCHMARK {
for (int i = 0, n = realitems.size(); i != n; ++i) {

View File

@ -41,6 +41,17 @@
#include <QString>
struct Qt4String : QString
{
Qt4String() {}
Qt4String(const QString &s) : QString(s) {}
};
QT_BEGIN_NAMESPACE
uint qHash(const Qt4String &);
QT_END_NAMESPACE
struct String : QString
{
String() {}

View File

@ -41,6 +41,22 @@
#include "main.h"
QT_BEGIN_NAMESPACE
uint qHash(const Qt4String &str)
{
int n = str.length();
const QChar *p = str.unicode();
uint h = 0;
while (n--) {
h = (h << 4) + (*p++).unicode();
h ^= (h & 0xf0000000) >> 23;
h &= 0x0fffffff;
}
return h;
}
static void doHash(const unsigned short *p, uint &h)
{
#if 1
@ -67,8 +83,6 @@ static void doHash(const unsigned short *p, uint &h)
#endif
}
QT_BEGIN_NAMESPACE
uint qHash(const String &str)
{
const unsigned short *p = (unsigned short *)str.constData();