Copy Qt 4's QString hash algorithm.
authorRobin Burchell <robin+qt@viroteck.net>
Tue, 28 Feb 2012 19:56:14 +0000 (20:56 +0100)
committerQt by Nokia <qt-info@nokia.com>
Wed, 29 Feb 2012 21:39:00 +0000 (22:39 +0100)
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>
tests/benchmarks/corelib/tools/qhash/main.cpp
tests/benchmarks/corelib/tools/qhash/main.h
tests/benchmarks/corelib/tools/qhash/outofline.cpp

index 7a871b4..62384fb 100644 (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) {
index c4cf94e..3d193b5 100644 (file)
 
 #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() {}
index 162c604..8adaa0a 100644 (file)
 
 #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();