Remove qhash_faster.

It's not faster under _any_ metric than the new algorithm, and it loses a lot of
spread which is a bad thing.

Change-Id: Ic87258f1c887822ffea1cb1517355564fabc3c26
Reviewed-by: João Abecasis <joao.abecasis@nokia.com>
bb10
Robin Burchell 2012-02-28 21:04:53 +01:00 committed by Qt by Nokia
parent 1f4804452c
commit b147da00c5
3 changed files with 0 additions and 73 deletions

View File

@ -57,8 +57,6 @@ private slots:
void initTestCase();
void qhash_qt4_data() { data(); }
void qhash_qt4();
void qhash_faster_data() { data(); }
void qhash_faster();
void javaString_data() { data(); }
void javaString();
@ -151,22 +149,6 @@ void tst_QHash::qhash_qt4()
}
}
void tst_QHash::qhash_faster()
{
QFETCH(QStringList, items);
QHash<String, int> hash;
QList<String> realitems;
foreach (const QString &s, items)
realitems.append(s);
QBENCHMARK {
for (int i = 0, n = realitems.size(); i != n; ++i) {
hash[realitems.at(i)] = i;
}
}
}
void tst_QHash::javaString()
{
QFETCH(QStringList, items);

View File

@ -52,17 +52,6 @@ uint qHash(const Qt4String &);
QT_END_NAMESPACE
struct String : QString
{
String() {}
String(const QString &s) : QString(s) {}
};
QT_BEGIN_NAMESPACE
uint qHash(const String &);
QT_END_NAMESPACE
struct JavaString : QString
{
JavaString() {}

View File

@ -57,50 +57,6 @@ uint qHash(const Qt4String &str)
return h;
}
static void doHash(const unsigned short *p, uint &h)
{
#if 1
// Copied from static uint hash(const QChar *p, int n).
// Possibly not the cheapest way.
h = (h << 4) + (*p++);
h ^= (h & 0xf0000000) >> 23;
h &= 0x0fffffff;
h = (h << 4) + (*p++);
h ^= (h & 0xf0000000) >> 23;
h &= 0x0fffffff;
h = (h << 4) + (*p++);
h ^= (h & 0xf0000000) >> 23;
h &= 0x0fffffff;
h = (h << 4) + (*p++);
h ^= (h & 0xf0000000) >> 23;
h &= 0x0fffffff;
#else
// Faster, but probably less spread.
h ^= *(unsigned int *)p;
#endif
}
uint qHash(const String &str)
{
const unsigned short *p = (unsigned short *)str.constData();
const int s = str.size();
switch (s) {
case 0: return 0;
case 1: return *p;
case 2: return *(unsigned int *)p;
case 3: return (*(unsigned int *)p) ^ *(p + 2);
//case 3: return (*p << 11) + (*(p + 1) << 22) + *(p + 2);
}
uint h = 0;
doHash(p, h);
doHash(p + s / 2 - 2, h);
doHash(p + s - 4, h);
return h;
}
// The Java's hashing algorithm for strings is a variation of D. J. Bernstein
// hashing algorithm appeared here http://cr.yp.to/cdb/cdb.txt
// and informally known as DJB33XX - DJB's 33 Times Xor.