QHostAddress: improve qHash implementation
authorGiuseppe D'Angelo <dangelog@gmail.com>
Wed, 4 Apr 2012 19:37:04 +0000 (20:37 +0100)
committerQt by Nokia <qt-info@nokia.com>
Sun, 8 Apr 2012 16:25:10 +0000 (18:25 +0200)
Avoid the conversion to a temporary QString -- just hash the address
as a byte array.

Change-Id: Ic35cdbbc3ee66c32a28d911bd27de0092395979f
Done-with: Shane Kearns
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
src/network/kernel/qhostaddress.cpp
src/network/kernel/qhostaddress.h
tests/auto/network/kernel/qhostaddress/tst_qhostaddress.cpp

index 2adf19e..3c08717 100644 (file)
@@ -1029,7 +1029,8 @@ QDebug operator<<(QDebug d, const QHostAddress &address)
 
 uint qHash(const QHostAddress &key, uint seed)
 {
-    return qHash(key.toString(), seed);
+    QT_ENSURE_PARSED(&key);
+    return qHash(QByteArray::fromRawData(reinterpret_cast<const char *>(key.d->a6.c), 16), seed);
 }
 
 #ifndef QT_NO_DATASTREAM
index b298e3f..ce4470d 100644 (file)
@@ -123,6 +123,7 @@ public:
 
     static QPair<QHostAddress, int> parseSubnet(const QString &subnet);
 
+    friend Q_NETWORK_EXPORT uint qHash(const QHostAddress &key, uint seed = 0);
 protected:
     QScopedPointer<QHostAddressPrivate> d;
 };
@@ -134,9 +135,6 @@ inline bool operator ==(QHostAddress::SpecialAddress address1, const QHostAddres
 Q_NETWORK_EXPORT QDebug operator<<(QDebug, const QHostAddress &);
 #endif
 
-
-Q_NETWORK_EXPORT uint qHash(const QHostAddress &key, uint seed = 0);
-
 #ifndef QT_NO_DATASTREAM
 Q_NETWORK_EXPORT QDataStream &operator<<(QDataStream &, const QHostAddress &);
 Q_NETWORK_EXPORT QDataStream &operator>>(QDataStream &, QHostAddress &);
index a0403e5..d1027c8 100644 (file)
@@ -323,6 +323,8 @@ void tst_QHostAddress::compare()
     QFETCH(bool, result);
 
     QCOMPARE(first == second, result);
+    if (result == true)
+        QVERIFY(qHash(first) == qHash(second));
 }
 
 void tst_QHostAddress::assignment()